Por que Number.MAX_SAFE_INTEGER 9.007.199.254.740.991 e não 9.007.199.254.740.992?

ECMAScript 6'sNumber.MAX_SAFE_INTEGER supostamente representa o valor numérico máximo que o JavaScript pode armazenar antes que surjam problemas com precisão de ponto flutuante. No entanto, é obrigatório que o número 1 adicionado a esse valor também seja representável como umNumber.

Number.MAX_SAFE_INTEGER

NOTA O valor deNumber.MAX_SAFE_INTEGER é o maior número inteiron de tal modo quen en + 1 são ambos exatamente representáveis comoNumber valor.

O valor deNumber.MAX_SAFE_INTEGER é9007199254740991 (2^53−1).

Especificação de idioma do ECMAScript

Todos os consoles JavaScript do Chrome, Firefox, Opera e IE11 podem realizar cálculos com segurança com o número 9.007.199.254.740.992. Alguns testes:

// 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

Por que é um requisito quen + 1 também deve ser representável comoNumber? Por que não fazer isso faz o valorinseguro?

questionAnswers(2)

yourAnswerToTheQuestion