MySQL使用带有十进制的数学函数运行查询返回错误的结果

时间:2012-08-09 16:07:08

标签: mysql

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

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

再次感谢

示例:

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

我已经尝试了+ 0.0000技巧并且没有运气

1 个答案:

答案 0 :(得分:3)

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

因此,它不是乘法运算的“失败”。您为rate存储的值(显然)为.0025的十进制值。该值不能在IEEE浮点中完全表示,因此存储的是最接近的可能近似值。当该近似值乘以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数据类型定义列,使用浮点列定义AVOID。

浮点值的这种行为已在文档末尾详细记录:

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