【问题标题】:Using GREATEST() on float type values gives inaccurate results对浮点类型值使用 GREATEST() 会产生不准确的结果
【发布时间】:2015-03-03 08:45:57
【问题描述】:

我正在试验 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 处理浮点值的方式很奇怪,正如 this article 中所述,但我不清楚这些额外数字来自哪里?

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

提前致谢!

【问题讨论】:

  • 嗯,这对你来说是浮动的。尝试给它一个精度,更好的主意,不要在你真正想要的是十进制的地方使用浮点数!也就是说,这个结果没有什么不准确的!
  • 看起来 MySQL 将您的 FLOAT 转换为 DOUBLE,由于这种类型的精度不同,最后会产生一些垃圾。
  • @PetSerAl 嗯,现在说得通了。感谢您的回答!

标签: mysql floating-accuracy


【解决方案1】:

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

Round(10.123456789101,2); 

将 2 个额外的数字显示为 10.12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多