有人可以解释为什么在这里乘以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/