gpt4 book ai didi

MySQL 在 float 上使用数学函数运行查询,返回错误结果

转载 作者:行者123 更新时间:2023-11-29 05:34:31 25 4
gpt4 key购买 nike

好吧,我有一个奇怪的问题,我正在运行一个查询,它在选择中获取结果并将其乘以 2000,即 0.0025 * 2000 并给我 4.9999888419121 或其他应该为 5 的东西。我已经看到了这有问题,但我还没有找到是否有解决方案。我认为数学就像一个基本的计算函数,为什么它会在乘法这样简单的请求中失败。

我不确定是否有解决此问题的方法,我确实一直在研究它,但我认为如果有人知道的话,它会在这里。

再次感谢

例子:

SELECT (table.rate * 2000) as per_ton ...

我已经尝试了 + 0.0000 个技巧,但都没有成功

最佳答案

这个问题不是 MySQL 独有的。这是 IEEE 浮点表示法的一个常见问题,它存储十进制值的近似值。 (IEEE 浮点类型存储精确的基数 2 表示。)

所以,这不是乘法运算的“失败”。您为 rate 存储的值(显然)是十进制值 .0025。该值不能用 IEEE float 精确表示,因此存储的是最接近的近似值。当这个近似值乘以 2000 时,结果也是一个近似值,然后再转换回十进制显示。

“修复”是使用 DECIMAL 数据类型,而不是浮点类型,并使用“大十进制”运算而不是浮点运算来执行乘法运算。

在进行乘法运算之前,您可以通过将其转换回指定精度的小数来尝试反转该近似值:

SELECT (CAST(table.rate AS DECIMAL(18,4) * 2000) AS per_ton ...

或者,您可以尝试使用 ROUND() 函数来去除不需要的精度数字,例如

SELECT ROUND((table.rate * 2000),4) AS per_ton ...

这将使结果四舍五入到 5.0000

不过,真正的“修复”是使用 DECIMAL 数据类型定义您的列,并完全避免使用浮点列。

浮点值的这种行为在手册末尾有详细记录:

http://dev.mysql.com/doc/refman/5.1/en/problems-with-float.html

关于MySQL 在 float 上使用数学函数运行查询,返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com