MySQL在浮点上使用数学函数运行查询,十进制返回错误结果

MySQL在浮点上使用数学函数运行查询,十进制返回错误结果,mysql,Mysql,好的,我有一个奇怪的问题,我在运行一个查询,在select中,它取结果,然后乘以2000,即0.0025*2000,当它应该是5时,给我4.9999848419121或其他什么。我已经看到这方面存在问题,但我还没有找到解决办法。我认为数学就像一个基本的计算函数,为什么它会在乘法这样简单的请求中失败呢 我不确定是否有解决办法,我真的一直在研究它,但我想如果有人知道它会在这里 再次感谢 例如: SELECT (table.rate * 2000) as per_ton ... 我尝试了+0.000

好的,我有一个奇怪的问题,我在运行一个查询,在select中,它取结果,然后乘以2000,即0.0025*2000,当它应该是5时,给我4.9999848419121或其他什么。我已经看到这方面存在问题,但我还没有找到解决办法。我认为数学就像一个基本的计算函数,为什么它会在乘法这样简单的请求中失败呢

我不确定是否有解决办法,我真的一直在研究它,但我想如果有人知道它会在这里

再次感谢

例如:

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

我尝试了+0.0000技巧,但都没有运气

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

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

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

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

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数据类型定义列,并完全避免使用浮点列

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


实际上,5.0(以及任何其他整数)可以用浮点精确表示。问题是0.0025。但您错了,5.0和4.9999848419121表示相同。问题是因为.0025的表示形式实际上比.0025小一点,所以当你用它乘以2000时,你会得到比5.0小一点的值。