ruby浮点错误

Joh*_*one 10 ruby floating-point

有人可以解释为什么乘以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
Run Code Online (Sandbox Code Playgroud)

Ric*_*gan 26

如果你手动进行双精度二进制计算(限制为53位有效位),你会看到发生了什么:

129.95 = 1.0000001111100110011001100110011001100110011001100110 x 2 ^ 7

129.95*100 = 1.1001011000010111111111111111111111111111111111111111011 x 2 ^ 13

这是56位有效位,所以四舍五入到53位

1.1001011000010111111111111111111111111111111111111111 x 2 ^ 13,等于

12994.999999999998181010596454143524169921875

现在129.95*10 = 1.01000100110111111111111111111111111111111111111111111 x 2 ^ 10

这是54位有效位长,因此舍入到53位,它是1.01000100111 x 2 ^ 10 = 1299.5

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