为什么Number.MAX_SAFE_INTEGER 9,007,199,254,740,991而不是9,007,199,254,740,992?

时间:2014-10-15 10:33:17

标签: javascript ecmascript-6 integer ieee-754

ECMAScript 6' s Number.MAX_SAFE_INTEGER应该代表JavaScript在浮点精度出现问题之前可以存储的最大数值。但是,要求添加到此值的数字1也必须表示为Number

  

Number.MAX_SAFE_INTEGER

     

注意Number.MAX_SAFE_INTEGER的值是最大整数n,因此nn + 1都可以完全表示为Number值。

     

Number.MAX_SAFE_INTEGER的值为9007199254740991 (2^53−1)

     

- ECMAScript Language Specification

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 个答案:

答案 0 :(得分:32)

我想说的是因为虽然Math.pow(2, 53)是最大的可直接表示的整数,但它的不安全,因为它的第一个值表示也是另一个值的近似值:

9007199254740992 == 9007199254740993 // true

Math.pow(2, 53) - 1

相反

9007199254740991 == 9007199254740993 // false

答案 1 :(得分:0)

唯一靠近另一个的数字 与下一个数字比较时显示为真

9007199254740992 == 9007199254740993
true
9007199254740993 == 9007199254740994
false
9007199254740991 == 9007199254740992
false
9007199254740997 == 9007199254740998
false