对浮点类型值使用 GREATEST() 会给出不准确的结果

Using GREATEST() on float type values gives inaccurate results

提问人:Gergely Lukacsy 提问时间:3/3/2015 最后编辑:Isaac BennetchGergely Lukacsy 更新时间:3/7/2015 访问量:69

问:

我正在试验 mysql,并使用该函数进行查询以比较两个不同的字段。GRATEST()

我的查询如下所示:

SELECT
  id,
  float1,
  float2,
  GREATEST(
    IFNULL(float1, 0),
    IFNULL(float2, 0)
  ) AS gtst
FROM `test`

Float1 和 2 是 UNSIGNED FLOAT,默认值为 NULL。 服务器版本:5.1.73-1-log,客户端:5.0.8-dev,PHP扩展:mysqli。

运行上面的命令给了我这样的奇怪值:

 | id  | float1 | float2 | gtst             |
 |-----|--------|--------|------------------|
 | 872 | 348.5  | 348.58 | 348.579986572266 |

我知道MySQL处理浮点值很奇怪,正如本文所述,但我不清楚这些额外的数字来自哪里?

单个比较不应该改变提供的值,对吧?这里没有舍入误差可能起作用的数学方程式,那么可能出了什么问题呢?

提前致谢!

mysql 浮点精度

评论

1赞 Strawberry 3/3/2015
好吧,这就是你的漂浮物。试着给它一个精度,更好的主意,不要在你真正想要的是十进制的地方使用浮点数!也就是说,这个结果并没有什么不准确的!
1赞 user4003407 3/8/2015
看起来MySQL将你的转换为,由于这种类型的精度不同,这在最后会产生一些垃圾。FLOATDOUBLE

答:

0赞 user2042292 3/3/2015 #1

似乎您已将 float1 和 float2 声明为 float 数据类型,它通常需要 12 个小数点,例如 10.123456789101 使用

Round(10.123456789101,2); 

将 2 位额外数字显示为 10.12