1

我只是遇到了这个问题,无法弄清楚为什么 Ruby 会这样。

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

6.84 - 3.6 == 3.2399999999999998

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

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

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

4

7 回答 7

3

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

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

于 2012-05-23T14:12:43.920 回答
3

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

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

于 2012-05-23T14:12:48.337 回答
1

在大多数情况下,浮点数/双精度数不是那么精确(因为浮点数用 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;
}  
于 2012-05-23T14:24:03.377 回答
1

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

这个

于 2012-05-23T14:32:46.747 回答
0

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

于 2012-05-23T14:14:55.003 回答
0

0.01 或 0.07 无法以二进制浮点数精确表示。

于 2012-05-23T14:20:59.577 回答
0

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

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

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

于 2012-05-23T15:06:42.227 回答