【发布时间】:2014-12-10 09:37:44
【问题描述】:
ECMAScript 6 的 Number.MAX_SAFE_INTEGER 应该代表 JavaScript 在浮点精度问题出现之前可以存储的最大数值。但是,要求添加到此值的数字 1 也必须可以表示为 Number。
Number.MAX_SAFE_INTEGER注意
Number.MAX_SAFE_INTEGER的值是n的最大整数,因此n和n + 1都可以精确地表示为Number值。
Number.MAX_SAFE_INTEGER的值为9007199254740991 (2^53−1)。
Chrome、Firefox、Opera 和 IE11 的 JavaScript 控制台都可以安全地执行数字 9,007,199,254,740,992 的计算。一些测试:
// Valid
Math.pow(2, 53) // 9007199254740992
9007199254740991 + 1 // 9007199254740992
9007199254740992 - 1 // 9007199254740991
9007199254740992 / 2 // 4503599627370496
4503599627370496 * 2 // 9007199254740992
parseInt('20000000000000', 16) // 9007199254740992
parseInt('80000000000', 32) // 9007199254740992
9007199254740992 - 9007199254740992 // 0
9007199254740992 == 9007199254740991 // false
9007199254740992 == 9007199254740992 // true
// Erroneous
9007199254740992 + 1 // 9007199254740992
9007199254740993 + "" // "9007199254740992"
9007199254740992 == 9007199254740993 // true
为什么要求n + 1 也必须可以表示为Number?为什么失败会使值不安全?
【问题讨论】:
-
可能是因为
2^53 - 1是最后一个可以准确表示的值 -2^53将给出与2^53 + 1相同的值(“被盗”来自leanpub.com/understandinges6/read#leanpub-auto-numbers) -
数字从
0开始..也许是这个原因。
标签: javascript ecmascript-6 integer ieee-754