我知道有一个技巧可以使用以下方法将十进制数转换为整数x|0
:
例如 :
3.14|0
-->3
这里不涉及四舍五入:
3.999 |0 -->
3`
问题
但是:为什么
9.99999999999|0
产量9
尽管
9.9999999999999999|0
产量10
?
我知道有一个技巧可以使用以下方法将十进制数转换为整数x|0
:
例如 :
3.14|0
-->3
这里不涉及四舍五入:
3.999 |0 -->
3`
问题
但是:为什么
9.99999999999|0
产量9
尽管
9.9999999999999999|0
产量10
?
9.9999999999999999
有太多小数并且在 Javascript 表示中失去精度,变成 10。你可以测试一下:
9.9999999999999999 === 10
将是true
我需要查看 Firefox 的源代码,但是尝试一些示例很有趣:
>>> 9.99999999999999999.toString(2)
"1010"
>>> 9.9999999999999999.toString(2)
"1010"
>>> 9.999999999999999.toString(2)
"1001.1111111111111111111111111111111111111111111111111"
>>> 9.999999999999999.toString(2).length
54
>>> 9.99999999999999.toString(2)
"1001.111111111111111111111111111111111111111111111101"
>>> 9.99999999999999.toString(2).length
53
粗略估计:大约 49 位进入尾数,剩下 15 位用于符号和指数。
更新:我在 comp.lang.javascript 常见问题解答中发现了一个有趣的条目,请参阅http://www.jibbering.com/faq/#FAQ4_7 它将双精度类型的精度限制为 53 位。
我认为在按位逻辑或运算之前将 double 转换为 32 位 int 时,精度已经耗尽。