说说数据库里那些小数类型,怎么用又有哪些坑和注意点
- 问答
- 2026-01-13 07:14:52
- 1
说到数据库里的小数类型,这确实是设计表结构时一个看似简单、实则容易埋坑的地方,你要是随便选,等到对账对不上、金额差了一分钱,或者计算出现一堆莫名其妙的小数点时,可就头疼了,咱们就聊聊常见的几种用来存小数的字段类型,它们怎么用,以及有哪些需要特别注意的“坑”。
浮点数类型:FLOAT 和 DOUBLE
这两种类型你可以理解为是“近似”存储小数,它们并不是把你存的数字原封不动地记下来,而是用一种科学计数法的方式,用有限的二进制位去表示一个很大范围的数据。

- 怎么用:当你需要存储的数据范围非常大,比如从非常非常小的科学实验数据到非常大的天文数字,同时对精度要求不是那种一分钱都不能错的场景,可以用它们,DOUBLE 比 FLOAT 能表示的精度更高、范围更大。
- 最大的坑:精度丢失,计算不精确
这是最核心的问题,因为计算机用二进制,而我们习惯用十进制,很多十进制的有限小数(比如0.1)在二进制里是无限循环的,FLOAT 和 DOUBLE 由于存储空间有限,只能截取一部分,所以它存下的就是一个近似值,当你进行多次计算后,这个近似误差可能会被放大。
- 举个例子(来源:无数程序员的血泪教训):你在数据库里用 FLOAT 存了 0.1 和 0.2,然后写个 SQL 查询
SELECT 0.1 + 0.2,你期望的结果是 0.3,但数据库返回的可能是一个极其接近 0.3 的数,0.30000000000000004,如果你用这个结果去做等值比较(WHERE 金额 = 0.3),就会查不到数据。绝对不要用 FLOAT/DOUBLE 来存储货币这类要求精确计算的字段。
- 举个例子(来源:无数程序员的血泪教训):你在数据库里用 FLOAT 存了 0.1 和 0.2,然后写个 SQL 查询
- 注意点:如果用了 FLOAT/DOUBLE,要避免直接的等值比较和判断,应该用范围比较,比如判断两个数的差值是否在一个极小的误差范围内。
定点数类型:DECIMAL (或 NUMERIC)
这种类型就是为了解决浮点数不精确的问题而生的,它是“精确”存储小数,你可以把它想象成直接把数字当成字符串一样,按小数点位置原样存储。

- 怎么用:这是存储财务数据、货币金额、以及其他任何要求计算结果完全精确的数据的首选,你在定义 DECIMAL 字段时,需要指定两个参数:精度(precision)和小数位数(scale),格式通常是
DECIMAL(M, D)。- M (精度):代表总共的数字位数,包括小数点前和小数点后的所有数字。
DECIMAL(5,2),M 是 5。 - D (小数位数):代表小数点后面保留几位数字。
DECIMAL(5,2),D 是 2,表示小数点后保留2位。 - 例子:
DECIMAL(5,2)可以存储像 123.45 这样的数,它总共有5位数(1,2,3,4,5),小数点后有2位,但它不能存储 1234.56,因为总位数超过了5;也不能存储 123.456,因为小数位超过了2,数据库通常会进行四舍五入或直接报错,这取决于数据库的设置。
- M (精度):代表总共的数字位数,包括小数点前和小数点后的所有数字。
- 优点:计算精确,没有浮点数的那种误差,做加减乘除,该是多少就是多少。
- 坑和注意点:
- 存储空间和性能开销:因为它是精确存储,所以占用的存储空间通常会比 FLOAT/DOUBLE 大,计算速度也会慢一些,但这在现在的硬件条件下,对于绝大多数业务系统来说,用这点性能换取数据的绝对准确是完全值得的。
- 参数 M 和 D 要设计好:这是最容易出问题的地方,如果你定义一个
DECIMAL(10,2)来存金额,觉得够用了,因为觉得最大能存到99999999.99,将近一个亿,但万一业务发展,出现了上亿的金额,这个字段就存不下了,会导致插入数据失败,设计的时候一定要根据业务可能的最大值和需要的精度,适当放宽 M 和 D 的值,留出足够的余量,比如金额字段,可以考虑DECIMAL(15,2)甚至更大。 - 除法运算的精度扩展:做除法时,结果的小数位数可能会变多。
DECIMAL(10,2)的数除以DECIMAL(10,2)的数,结果应该定义成多少位呢?数据库系统有自己的一套规则来处理,但有时可能需要你手动用函数来控制结果的小数位数,避免出现你不想要的超长小数。
整数类型:INT, BIGINT 等
存小数不一定非要用小数类型。
- 怎么用:当你实际要存的数据本质上是整数,但以某个单位衡量时表现为小数,就可以用整数类型,最经典的例子就是存金额,以“分”为单位。
- 例子:你在页面上显示的是“元”,12.34 元,但在数据库里,你不存 12.34,而是存 1234(分),这样,所有的计算(加减乘除)都是在整数之间进行,从根本上杜绝了小数精度问题。
- 优点:计算速度最快,完全没有精度烦恼,存储空间也可能更省。
- 坑和注意点:
- 业务逻辑转换:你必须在程序代码里处理好“元”和“分”的转换,在从数据库取数展示给用户前,要除以100;在接收用户输入存入数据库前,要乘以100,这个转换逻辑必须在整个系统里保持一致,任何一环忘了转换都会导致严重错误。
- 除法的处理:即使以分为单位,做除法时(比如计算平均价格)可能还是会产生小数,这时你需要在代码里决定是向上取整、向下取整还是四舍五入,并做好记录,保证业务逻辑公平。
- 要精确,特别是钱: 毫不犹豫地用
DECIMAL,并仔细规划好位数。 - 范围超大,可接受近似值: 比如科学计算、传感器数据,可以用
FLOAT/DOUBLE,但要小心比较操作。 - 换个思路,化小数为整数: 像金额这种,考虑用整数类型存最小单位,简单粗暴效果好。
在选择之前,最好在你的数据库管理系统里亲手试一试,感受一下不同类型的计算和存储差异,这样印象会更深刻。
本文由盈壮于2026-01-13发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/79790.html
