¿Cuál es el valor entero más alto de JavaScript al que puede llegar un número sin perder precisión?

Resuelto TALlama asked hace 16 años • 21 respuestas

¿Está esto definido por el idioma? ¿Hay un máximo definido? ¿Es diferente en diferentes navegadores?

TALlama avatar Nov 21 '08 05:11 TALlama
Aceptado

JavaScript tiene dos tipos de números: Numbery 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 Numbertipo (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
Expandir fragmento


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.

Jimmy avatar Nov 20 '2008 22:11 Jimmy

>= ES6:

Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;

<= ES5

De la referencia :

Number.MAX_VALUE;
Number.MIN_VALUE;

Mostrar fragmento de código

Peter Bailey avatar Nov 20 '2008 22:11 Peter Bailey

Es 2 53 == 9 007 199 254 740 992. Esto se debe a que Numberlos 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

Vjeux avatar Dec 07 '2010 10:12 Vjeux