BigInt de JavaScript

Las variables BigInt de JavaScript se utilizan para almacenar valores de enteros demasiado grandes para que se puedan representar con números JavaScript normales.

Precisión de entero de JavaScript

Los enteros de JavaScript solo pueden ser precisos hasta 15 dígitos:

Precisión de entero

let x = 999999999999999;
let y = 9999999999999999;

Prueba por tu cuenta

En JavaScript, todos los números se almacenan en formato de coma flotante de 64 bits (estándar IEEE 754).

De acuerdo con este estándar, los enteros grandes no se pueden representar con precisión y se redondearán.

Por lo tanto, JavaScript solo puede representar de manera segura los enteros en el siguiente rango:

  • el más grande es 9007199254740991(253-1)
  • el más pequeño es -9007199254740991(-(253-1))

Los valores enteros fuera de este rango perderán precisión.

Cómo crear BigInt

Para crear BigInt, puede agregar al final del entero n,o llamar BigInt() Función:

Ejemplo 1

let x = 9999999999999999;
let y = 9999999999999999n;

Prueba por tu cuenta

Ejemplo 2

let x = 1234567890123456789012345n;
let y = BigInt(1234567890123456789012345);

Prueba por tu cuenta

BigInt: un nuevo tipo de datos de JavaScript

El tipo de JavaScript de BigInt es "bigint

Ejemplo

let x = BigInt(999999999999999);
let type = typeof x;

Prueba por tu cuenta

BigInt es el segundo tipo de datos numéricos en JavaScript (después de Number).

Para BigInt, el número total de tipos de datos admitidos por JavaScript es de 8:

  1. String
  2. Number
  3. Bigint
  4. Boolean
  5. Undefined
  6. Null
  7. Symbol
  8. Object

Operadores de BigInt

Los operadores de operaciones de Number JavaScript también se pueden usar con BigInt.

Ejemplo de multiplicación de BigInt

let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

Prueba por tu cuenta

Nota

No se permite realizar operaciones aritméticas entre BigInt y Number (la conversión de tipo perderá información).

BigInt no puede realizar la operación de desplazamiento aritmético a la derecha sin signo (>>>), ya que no tiene un ancho fijo.

Decimales de BigInt

BigInt no puede tener decimales.

Ejemplo de división de BigInt

let x = 5n;
let y = x / 2;
// Error: No se puede mezclar BigInt con otros tipos, utilice conversión explícita.
let x = 5n;
let y = Number(x) / 2;

Prueba por tu cuenta

BigInt en hexadecimal, octal y binario

BigInt también se puede escribir en notación hexadecimal, octal o binaria:

Ejemplo de BigInt en hexadecimal

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

Prueba por tu cuenta

Curiosidad de precisión

El redondeo puede comprometer la seguridad del programa:

Ejemplo de MAX_SAFE_INTEGER

9007199254740992 === 9007199254740993; // ¡es verdadero!!!

Prueba por tu cuenta

Compatibilidad del navegador

Desde septiembre de 2020, todos los navegadores soportan BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
Mayo de 2018 Enero de 2020 Julio de 2019 Septiembre de 2020 Junio de 2018

Números enteros seguros máximos y mínimos

ES6 ha añadido las propiedades max y min al objeto Number:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER

Ejemplo de MAX_SAFE_INTEGER

let x = Number.MAX_SAFE_INTEGER;

Prueba por tu cuenta

Ejemplo de MIN_SAFE_INTEGER

let x = Number.MIN_SAFE_INTEGER;

Prueba por tu cuenta

Nuevos métodos de número

ES6 también ha añadido dos nuevos métodos al objeto Number:

  • Number.isInteger()
  • Number.isSafeInteger()

Método Number.isInteger()

El método Number.isInteger() devuelve true.

Ejemplo de isInteger()

Number.isInteger(10);
Number.isInteger(10.5);

Prueba por tu cuenta

Método Number.isSafeInteger()

Los enteros seguros son enteros que se pueden representar con precisión como números de coma flotante.

El método Number.isSafeInteger() devuelve true.

Ejemplo de isSafeInteger()

Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);

Prueba por tu cuenta

Los enteros seguros son enteros desde -(253 de -1 a +253 de todos los enteros.

Esto es un entero seguro: 9007199254740991. Esto no es un entero seguro: 9007199254740992.