我只是遇到了这个问题,无法弄清楚为什么 Ruby 会这样。
有人可以解释为什么在 Ruby 中:
6.84 - 3.6 == 3.2399999999999998
而不仅仅是3.24?我知道它与这些数字的二进制表示有关
(Decimal('6.84') - Decimal('3.6'))
将返回预期的结果。我只是对 Float 行为的详细解释感到好奇。
我只是遇到了这个问题,无法弄清楚为什么 Ruby 会这样。
有人可以解释为什么在 Ruby 中:
6.84 - 3.6 == 3.2399999999999998
而不仅仅是3.24?我知道它与这些数字的二进制表示有关
(Decimal('6.84') - Decimal('3.6'))
将返回预期的结果。我只是对 Float 行为的详细解释感到好奇。
请参阅“为什么 100*0.07 等于 6.9999....? ”(以及许多其他地方)中关于浮点数学的答案。
因为 double/float 使用 base-2 表示法和十进制 base-10 表示法。
这是一个有用的链接:http ://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
在大多数情况下,浮点数/双精度数不是那么精确(因为浮点数用 base2 插入数字)。浮点运算的结果可能在不同的 CPU 上有所不同。接近 0.01 的区域比接近 0.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 和许多其他语言一样,将浮点数表达到荒谬的精度。