You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:27:23