今天开发中遇到了一个问题,感觉很奇怪。
见下面 sql:
a
是 bigint
,b
是 float(5,4)
, c
是 float(8,4)
, d
不是数据库里的字段是我要的结果。
b
数据都是 0.2211
之类的数据,c
是 0.0032
之类的数据。
SELECT
sum( ceil(a *(1 - b))* c ) AS d
FROM
tablea
如果不加上 sum
,我会得到 31.4600
,137.7000
,124.7000
这类数据(小数点最后一位均为0),但是我加上 sum
后,最后一位有数了。
我意识到是数据类型精度的问题,把 c
改成了 double
类型之后,就得到了正确的结果。
请问,我用 float
类型的时候,没有得到正确结果是什么原理?是 c
的 (8,4)
问题??c
的 (8,4)
使得 0.0032
,变成了 0.0032123
(最后三位随机了)??
补充一下,abc
所有值都是已经在数据库里的,不是临时插入的。
float(8,4)
后面的 8 和 4 是显示的精度,而不是内部表示的精度。如果想要精确值,可以使用
numeric(M,D)
或者decimal(M, D)
。里面涉及到的具体细节,参考我的博客: