今天开发中遇到了一个问题,感觉很奇怪。
见下面 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)。
里面涉及到的具体细节,参考我的博客:
代码之谜(四)- 浮点数(从惊讶到思考)
代码之谜(五)- 浮点数(谁偷了你的精度?)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。