mysql中float和double精度问题,sum奇怪的结果
高洛峰
高洛峰 2017-04-17 11:23:36
[MySQL讨论组]

今天开发中遇到了一个问题,感觉很奇怪。

见下面 sql:

abigintbfloat(5,4), cfloat(8,4), d 不是数据库里的字段是我要的结果。

b 数据都是 0.2211 之类的数据,c0.0032 之类的数据。

SELECT
    sum( ceil(a *(1 - b))* c ) AS d
FROM
    tablea

如果不加上 sum,我会得到 31.4600137.7000124.7000 这类数据(小数点最后一位均为0),但是我加上 sum 后,最后一位有数了。
我意识到是数据类型精度的问题,把 c 改成了 double 类型之后,就得到了正确的结果。

请问,我用 float 类型的时候,没有得到正确结果是什么原理?是 c(8,4) 问题??
c(8,4) 使得 0.0032,变成了 0.0032123(最后三位随机了)??


补充一下,abc 所有值都是已经在数据库里的,不是临时插入的。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
高洛峰

float(8,4) 后面的 8 和 4 是显示的精度,而不是内部表示的精度。

如果想要精确值,可以使用 numeric(M,D) 或者 decimal(M, D)

里面涉及到的具体细节,参考我的博客:

  • 代码之谜(四)- 浮点数(从惊讶到思考)
  • 代码之谜(五)- 浮点数(谁偷了你的精度?)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号