为什么6.84 – 3.6 == 3.2399999999999998

我刚刚遇到这个并且无法弄清楚Ruby为什么会这样做。

有人可以解释为什么在Ruby:

6.84 - 3.6 == 3.2399999999999998 

而不仅仅是3.24? 我知道它与那些数字的二进制表示有关

 (Decimal('6.84') - Decimal('3.6')) 

会返回预期的结果。 我只是对Float行为的详细解释感到好奇。

因为double / float使用base-2表示法和decimal base-10表示法。

这是一个有用的链接: http : //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

请参阅“ 为什么100 * 0.07等于6.9999 ……? ”(和许多其他地方)关于浮点数学的答案。

为什么100 * 0.07等于6.9999 ……?

在大多数情况下,Float / Double并不精确(因为浮点数用base2插入数字)。 浮点运算的结果可能因CPU而异。 接近.01的区域比接近.99的区域更精确

如果需要比较使用浮点运算计算的值,请使用epsilon值(非常小的值)以消除舍入误差。

伪代码:

 boolean equals(float x, float y) { float result = x - y; if(result*result < epsilon) return true; else false; } 

这是一个二进制浮点问题。

读这个

基数表示法-2和十进制基数由double和float使用

0.01或0.07不能用二进制浮点精确表示。

浮点使用本质上不精确的内部表示。 您应该始终将答案四舍五入以用于显示目的:

 '%.4f' % (6.84 - 3.6) # => "3.2400" 

留给自己的设备,Ruby和许多其他语言一样,将浮点数表达为荒谬的精度。