js中的按位运算符是不一致的?

时间:2013-09-02 10:53:00

标签: javascript bit-manipulation

我知道有一个技巧可以使用x|0将十进制数转换为整数:

例如:

3.14|0 - > 3

这里没有涉及四舍五入:

3.999 |0 --> 3`

问题

然而:为什么

9.99999999999|0收益9

,而

9.9999999999999999|0收益10

2 个答案:

答案 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的步骤中精度已用尽。