好吧所以我有一个奇怪的问题,我在运行一个查询,在选择它正在取结果并乘以2000即0.0025 * 2000并给我4.9999888419121或什么时应该是5.我看到了这有问题,但我还没有找到是否有解决方案。我认为数学就像一个基本的计算函数,为什么它会在乘法这样简单的请求中失败。
我不确定是否有解决方法,我确实一直在研究它,但我想如果有人知道它会在这里。
再次感谢
示例:
SELECT (table.rate * 2000) as per_ton ...
我已经尝试了+ 0.0000技巧并且没有运气
答案 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