请教FLOAT、DOUBLE、DECIMAL数据类型的区别、存储及适用场景
FLOAT、DOUBLE、DECIMAL三种数据类型详解
1. 三者分别是什么?
- FLOAT:单精度浮点数,属于近似数值类型,存储的是数值的近似值而非精确值。
- DOUBLE:双精度浮点数,同样是近似数值类型,精度比FLOAT更高,能表示的数值范围也更大。
- DECIMAL:定点数类型,也叫精确数值类型,可精准存储十进制数值,不会出现近似误差。
2. 内部存储方式差异
- FLOAT/DOUBLE:采用二进制浮点格式存储,把数值拆分为符号位、指数位、尾数位三个部分。比如FLOAT用32位存储空间(1位符号+8位指数+23位尾数),DOUBLE用64位(1位符号+11位指数+52位尾数)。这种方式无法精准表示所有十进制小数,比如0.1转成二进制是无限循环的,只能截取近似值存储。
- DECIMAL:采用十进制编码(通常是BCD编码,每4位二进制对应1位十进制数)存储,直接记录数字的每一位,同时标记小数点位置和符号。比如
DECIMAL(10,2)会把数值拆成8位整数和2位小数,精准保存每一位数字。
3. 各自适用场景
- FLOAT:适合对精度要求不高、追求存储空间节省的场景,比如游戏中的角色坐标、粗略的环境传感器数据。
- DOUBLE:适合需要较高精度但可接受微小近似误差的场景,比如科学计算中的物理量、统计分析的近似统计值。
- DECIMAL:适合必须精确计算的场景,比如货币金额、税务核算、账单明细等,任何不能容忍数值误差的业务都优先用它。
4. 为何货币用DECIMAL,科学计算用FLOAT/DOUBLE?
货币场景:精确无误差是核心
货币计算容不得一分一毫的误差,DECIMAL的精确存储能完全避免近似误差带来的问题。举个例子:
-- FLOAT累加的误差示例 CREATE TABLE test_float (val FLOAT); INSERT INTO test_float VALUES (0.1), (0.1), (0.1); SELECT SUM(val) FROM test_float; -- 结果可能是0.30000001192092896,而非精确的0.3
换成DECIMAL则不会有这个问题:
-- DECIMAL的精确计算示例 CREATE TABLE test_decimal (val DECIMAL(10,2)); INSERT INTO test_decimal VALUES (0.10), (0.10), (0.10); SELECT SUM(val) FROM test_decimal; -- 结果精确为0.30
科学计算:范围与效率是核心
科学计算常要处理极大或极小的数值(比如天文距离、微观粒子质量),FLOAT/DOUBLE的二进制浮点存储能高效覆盖极广的数值范围,同时计算速度更快。而且这类场景通常允许微小的近似误差,精度完全能满足需求。
内容的提问来源于stack exchange,提问作者user32574314
相关产品推荐
相关产品推荐

