number max_value longest array javascript ecmascript-6 integer ieee-754

max_value - parseint javascript limit



¿Por qué es Number.MAX_SAFE_INTEGER 9,007,199,254,740,991 y no 9,007,199,254,740,992? (1)

Número de ECMAScript Number.MAX_SAFE_INTEGER supuestamente representa el valor numérico máximo que JavaScript puede almacenar antes de que surjan problemas con la precisión de coma flotante. Sin embargo, es un requisito que el número 1 agregado a este valor también deba ser representable como un Number .

Number.MAX_SAFE_INTEGER

NOTA El valor de Number.MAX_SAFE_INTEGER es el número entero mayor n tal que n y n + 1 son exactamente representables como un valor de Number .

El valor de Number.MAX_SAFE_INTEGER es 9007199254740991 (2^53−1) .

- Especificación del lenguaje ECMAScript

Las consolas JavaScript de Chrome, Firefox, Opera e IE11 pueden realizar cálculos de forma segura con el número 9,007,199,254,740,992. Algunas pruebas:

// 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 qué es un requisito que n + 1 también debe ser representable como un Number ? ¿Por qué si esto falla, el valor no es seguro ?


Yo diría que es porque mientras Math.pow(2, 53) es el entero más grande directamente representable, es inseguro en cuanto a que también es el primer valor en el que la representación es también una aproximación de otro valor:

9007199254740992 == 9007199254740993 // true

En contraste con Math.pow(2, 53) - 1

9007199254740991 == 9007199254740993 // false