有人可以解释为什么在这里乘以100会得到较不准确的结果,而在乘以10两次后会得到更准确的结果吗?

± % sc
Loading development environment (Rails 3.0.1)
>> 129.95 * 100
12994.999999999998
>> 129.95*10
1299.5
>> 129.95*10*10
12995.0

最佳答案

如果您使用 double 二进制文件(仅限于53个有效位)手动进行计算,您将看到发生了什么:

129.95 = 1.0000001111100110011001100110011001100110011001100110 x 2 ^ 7

129.95 * 100 = 1.1001011000010111111111111111111111111111111111111111011 x 2 ^ 13

这是56个有效位长,因此四舍五入为53位

1.1001011000010111111111111111111111111111111111111111 x 2 ^ 13,等于

12994.999999999998181010596596454143524169921875

现在129.95 * 10 = 1.01000100110111111111111111111111111111111111111111111111 x 2 ^ 10

这是54个有效位长,因此四舍五入为53位,即1.01000100111 x 2 ^ 10 = 1299.5

现在1299.5 * 10 = 1.1001011000011 x 2 ^ 13 = 12995。

关于 ruby 浮点错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4055618/

10-11 18:15