¿Cuál es el valor entero más alto de JavaScript al que puede llegar un número sin perder precisión?
¿Está esto definido por el idioma? ¿Hay un máximo definido? ¿Es diferente en diferentes navegadores?
JavaScript tiene dos tipos de números: Number
y BigInt
.
El tipo de número más utilizado, , es un número IEEE 754Number
de punto flotante de 64 bits .
El valor integral exacto más grande de este tipo es Number.MAX_SAFE_INTEGER
, que es:
- 2 53 -1, o
- +/- 9.007.199.254.740.991, o
- nueve mil billones siete billones ciento noventa y nueve mil doscientos cincuenta y cuatro millones setecientos cuarenta mil novecientos noventa y uno
Para poner esto en perspectiva: un billón de bytes es un petabyte (o mil terabytes).
"Seguridad" en este contexto se refiere a la capacidad de representar números enteros exactamente y compararlos correctamente.
De la especificación:
Tenga en cuenta que todos los números enteros positivos y negativos cuya magnitud no sea mayor que 2 53 son representables en el
Number
tipo (de hecho, el número entero 0 tiene dos representaciones, +0 y -0).
Para utilizar de forma segura números enteros mayores que este, debe utilizar BigInt
, que no tiene límite superior.
Tenga en cuenta que los operadores bit a bit y los operadores de desplazamiento operan con enteros de 32 bits, por lo que, en ese caso, el entero máximo seguro es 2 31 -1, o 2,147,483,647.
const log = console.log
var x = 9007199254740992
var y = -x
log(x == x + 1) // true !
log(y == y - 1) // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
log(x / 2) // 4503599627370496
log(x >> 1) // 0
log(x | 1) // 1
Nota técnica sobre el tema del número 9.007.199.254.740.992: Existe una representación IEEE-754 exacta de este valor, y puede asignar y leer este valor desde una variable, por lo que para aplicaciones cuidadosamente seleccionadas en el dominio de números enteros menores o iguales a este valor, podría tratarlo como un valor máximo.
En el caso general, debe tratar este valor IEEE-754 como inexacto, porque es ambiguo si está codificando el valor lógico 9.007.199.254.740.992 o 9.007.199.254.740.993.
>= ES6:
Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;
<= ES5
De la referencia :
Number.MAX_VALUE;
Number.MIN_VALUE;
Mostrar fragmento de código
Es 2 53 == 9 007 199 254 740 992. Esto se debe a que Number
los s se almacenan como punto flotante en una mantisa de 52 bits.
El valor mínimo es -2 53 .
Esto hace que sucedan algunas cosas divertidas.
Math.pow(2, 53) == Math.pow(2, 53) + 1
>> true
Y también puede ser peligroso :)
var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
// infinite loop
}
Lectura adicional: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html