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.
归档时间: |
|
查看次数: |
4045 次 |
最近记录: |