2012-08-09 47 views
1

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

我不确定是否有解决方案,我真的一直在研究它,但我认为如果有人知道它会在这里。

再次感谢

例如:

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

我已经试过+ 0.0000技巧和所有没有运气

回答

3

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

因此,这不是乘法运算的“失败”。您为价格储存的价值(显然)是十进制值0.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

真正的“修复”,虽然,是带小数点的数据类型定义的列,并使用浮点列在所有避免的。

浮点值的此行为是有据可查的,尽管,在手册末尾:

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

+1

实际上,5.0(和任何其它的整数)可以被精确表示在浮点。问题是0.0025。 – Barmar 2012-08-09 16:30:22

+0

但你错了,5.0和4.9999888419121表示相同。问题是因为.0025的表示实际上比0.0025略小,所以当你通过这个数字乘以2000时,你得到的东西比5.0小一些。 – Barmar 2012-08-09 16:43:50