ECMAScript 6 的 Number.MAX_SAFE_INTEGER
应该表示 JavaScript 在出现浮点精度问题之前可以存储的最大数值。但是,要求添加到此值的数字 1 也必须可以表示为 Number
。
Number.MAX_SAFE_INTEGER
NOTE The value of
Number.MAX_SAFE_INTEGER
is the largest integern
such thatn
andn + 1
are both exactly representable as aNumber
value.The value of
Number.MAX_SAFE_INTEGER
is9007199254740991 (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
?为什么失败会使值不安全?
最佳答案
我会说是因为 Math.pow(2, 53)
是最大的可直接表示的整数,它的不安全因为它也是表示的第一个值也是另一个值的近似值:
900719925474099<b><em>2</em></b> == 900719925474099<b><em>3</em></b> // true
对比Math.pow(2, 53) - 1
:
900719925474099<b><em>1</em></b> == 900719925474099<b><em>3</em></b> // false
关于javascript - 为什么 Number.MAX_SAFE_INTEGER 是 9,007,199,254,740,991 而不是 9,007,199,254,740,992?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380364/