这个问题的答案可能很痛苦,但我无法从Mozilla文档或Google的粗略搜索中找到答案。
如果您有这样的代码
Number.MAX_VALUE + 1; // Infinity, right?
Number.MIN_VALUE - 1; // -Infinity, right?
然后,我希望将任何内容添加到Number.MAX_VALUE会将其推到
Infinity
。结果就是Number.MAX_VALUE
吐口水又回到了我身边。但是,在Chrome JS控制台中玩耍时,我注意到在添加/减去足够多之前,它实际上并没有变成
Infinity
:Number.MAX_VALUE + Math.pow(100,1000); // now we hit Infinity
Number.MIN_VALUE - Math.pow(100,1000); // -Infinity at last
对
Number.MAX_VALUE
和Infinity
之间的“缓冲区”的解释是什么? 最佳答案
标准地...
在ECMAScript中,两个非零有限数的加法实现为(ECMA-262§11.6.3“将加法运算符应用于数字”):
IEEE-754的最近舍入模式指定(IEEE-754 2008§4.3.1“最接近的环绕方向属性”)
ECMAScript没有指定最近舍入中的哪一个,但是在这里并不重要,因为两者都给出相同的结果。 ECMAScript中的数字为“双”,其中
因此,结果必须至少为21024-2970〜1.7976931348623158×10308,才能四舍五入为无穷大。否则,它将四舍五入到MAX_VALUE,因为那比Infinity还要近。
请注意,MAX_VALUE = 21024-2971,因此您至少需要添加2971-2970 = 2970〜9.979202×10291才能获得无穷大。我们可以检查:
>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity
同时,您的
Math.pow(100,1000)
〜26643.9远远超出了21024-2970。它已经是无穷大。