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?