Javascript无法使用10100401822940525,它就像Windows中的'conn'文件夹一样。为什么js会因这个号码而失败?
您可以查看示例,
答案 0 :(得分:4)
在IEEE浮点类型数字中,数字越大,数字之间的差距越大。当你看看number is stored。
时,它是有道理的考虑有相同数量的可能值,负指数为非负数。这意味着在0和1之间存在相同数量的可能数字,因为在1和无穷大之间。显然,1和无穷大之间的数字进一步间隔开来。这个间距实际上是分布的,所以距离0越远,可能存储的数字之间的差距越大(没有真正的最大数字,最终你会达到无数字与Infinity无法区分的程度)。
这实际上非常有效,因为在大多数情况下,处理较大数字时需要较少的精度。 10100401822940524
和10100401822940526
之间的差异远小于1
和3
之间相对于数字大小的差异。能够表示数字2
而不是数字10100401822940525
更为重要,并且限制为64位。
答案 1 :(得分:1)
我发现了这个: http://gskinner.com/blog/archives/2011/03/the-case-of-the-disappearing-number.html
不知道他是对的,但这听起来很合理。 ;)
答案 2 :(得分:1)
这是浮点舍入的一个实例。 Javascript中的数字作为双精度浮点数存储(AFAIK)。浮点数的精度有限,因此当数字太大时,它们不能再存储为精确整数,而且需要舍入。
这是另一个例子,错误更大。 http://jsfiddle.net/NhZ75/
如果您想知道数学运算的原因,那是因为大多数计算机都以高于存储它的精度进行浮点数学运算,因此舍入误差通常仅在将数字存储在变量中时才会发生。