我知道有一个技巧可以使用x|0
将十进制数转换为整数:
例如:
3.14|0
- > 3
这里没有涉及四舍五入:
3.999 |0 -->
3`
问题
然而:为什么
9.99999999999|0
收益9
,而
9.9999999999999999|0
收益10
?
答案 0 :(得分:2)
9.9999999999999999
包含太多小数,在Javascript表示中失去精度,变为10.您可以测试:
9.9999999999999999 === 10
将为true
答案 1 :(得分:0)
我需要查看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 它将double类型的精度限制为53位。
我认为在按位逻辑或操作之前将double转换为32位int的步骤中精度已用尽。