0

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

例如 :

3.14|0 -->3

这里不涉及四舍五入:

3.999 |0 -->3`

问题

但是:为什么

9.99999999999|0产量9

尽管

9.9999999999999999|0产量10

4

2 回答 2

2

9.9999999999999999有太多小数并且在 Javascript 表示中失去精度,变成 10。你可以测试一下: 9.9999999999999999 === 10将是true

于 2013-09-02T10:57:04.833 回答
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 它将双精度类型的精度限制为 53 位。

我认为在按位逻辑或运算之前将 double 转换为 32 位 int 时,精度已经耗尽。

于 2013-09-02T11:07:12.047 回答