BigInt es un tipo de dato de Javascript que nace con la idea de permitir representar valores muy grandes, de una forma relativamente sencilla y compatible con lo que ya existe.
La problemática que existe actualmente con el tipo de dato Number es que valores más grandes de 253-1 no pueden ser representados, ya que superarían el límite seguro Number.MAX_SAFE_INTEGER y algunos resultados podrían perder precisión, como se puede ver en el siguiente ejemplo:
Ejemplo
const number = 2 ** 53 number.constructor.name; // "Number" (Es de tipo Number); number; // 9007199254740992; number + 1; // 9007199254740992; number + 5; // 9007199254740996; number + 40; // 9007199254741032;
Para poder realizar estas tareas de forma segura, podemos utilizar el tipo de dato BigInt simplemente añadiendo una n al final del número:
Ejemplo
const number = 2n ** 53n; number.constructor.name; // "BigInt" (Es de tipo BigInt) number; // 9007199254740992n number + 1n; // 9007199254740993n number + 5n; // 9007199254740997n number + 40n; // 9007199254741032n
...
Crear un Bigint
Para crear un BigInt, agregue n al final de un número entero o llame BigInt():
Ejemplo
let x = 15; let y = 15n;
Métodos de BigInt
El tipo de dato BigInt tiene dos métodos estáticos, que nos pueden servir para operar a nivel de bits. Disponemos de los métodos .asIntN() y .asUintN():
Método | Descripción |
---|---|
BigInt.asIntN(bits, bigNumber) | Ajusta bigNumber a bits (devuelve entero con signo). |
BigInt.asUintN(bits, bigNumber) | Ajusta bigNumber a bits (devuelve entero sin signo). |
En primer lugar, .asIntN() significa as (Signed) Integer Number. En el ejemplo vamos a usar 2 bits para representar un número con signo. Con 2 bits podemos representar 00, 01, 10 y 11, por lo que sólo podemos representar 4 números (en nuestro caso desde -2 hasta 1):
Ejemplo
// Con 2 bits con signo puedes representar desde (-2 hasta 1) BigInt.asIntN(2, -3n); // -3n (Representa el -3 con 2 bits) ❌ BigInt.asIntN(2, -2n); // -2n (Representa el -2 con 2 bits) ✅ 10 BigInt.asIntN(2, -1n); // -1n (Representa el -1 con 2 bits) ✅ 11 BigInt.asIntN(2, 0n); // 0n (Representa el 0 con 2 bits) ✅ 00 BigInt.asIntN(2, 1n); // 1n (Representa el 1 con 2 bits) ✅ 01 BigInt.asIntN(2, 2n); // -2n (Representa el 2 con 2 bits) ❌ BigInt.asIntN(2, 3n); // -1n (Representa el 3 con 2 bits) ❌
En segundo lugar, .asUintN significa as Unsigned Integer Number. En el ejemplo vamos a usar 2 bits para representar un número sin signo. Con 2 bits podemos representar 00, 01, 10 y 11, y como no tenemos signo y no debemos preocuparnos de los números negativos, tenemos más disponible para los números positivos. Podremos representar 4 números (en nuestro caso desde 0 hasta 4):
Ejemplo
// Con 2 bits sin signo puedes representar desde (0 hasta 4) BigInt.asUintN(2, -2n); // 2n (Representa el -2 con 2 bits) ❌ BigInt.asUintN(2, -1n); // 3n (Representa el -1 con 2 bits) ❌ BigInt.asUintN(2, 0n); // 0n (Representa el 0 con 2 bits) ✅ 00 BigInt.asUintN(2, 1n); // 1n (Representa el 1 con 2 bits) ✅ 01 BigInt.asUintN(2, 2n); // 2n (Representa el 2 con 2 bits) ✅ 10 BigInt.asUintN(2, 3n); // 3n (Representa el 3 con 2 bits) ✅ 11 BigInt.asUintN(2, 4n); // 0n (Representa el 4 con 2 bits) ❌
Operadores BigInt
Operadores que se pueden usar en un JavaScript Number también se puede utilizar en un BigInt.
ejemplo
let x = 9007199254740995n; let y = 9007199254740995n; let z = x * y;Salida: 81129638414606735738984533590025
Aritmética entre un BigInt y un Numberno está permitido (la conversión de tipo pierde información).
El desplazamiento a la derecha sin signo (>>>) no se puede realizar en un BigInt (no tiene un ancho fijo).
Decimales BigInt
BigInt no puede tener decimales.
ejemplo
let x = 5n; let y = Number(x) / 2;Salida:2.5
BigInt hexadecimal, octal y binario
BigInt también se puede escribir en notación hexadecimal, octal o binaria:
let hex = 0x20000000000003n; let oct = 0o400000000000000003n let bin = 0b100000000000000000000000000000000000000000000000000011n;Salida: 9007199254740995 9007199254740995 9007199254740995
Precisión Curiosidad
El redondeo puede comprometer la seguridad del programa:
9007199254740992 === 9007199254740993; // is true !!!
Números enteros mínimos y máximos seguros
Ejemplo MAX_SAFE_INTEGER
let x = Number.MAX_SAFE_INTEGER;Salida:9007199254740991
Ejemplo MIN_SAFE_INTEGER
let x = Number.MIN_SAFE_INTEGER;Salida:-9007199254740991
El método Number.isInteger()
los Number.isInteger() el método devuelve true si el argumento es un entero.
Ejemplo isInteger
Number.isInteger(10); Number.isInteger(10.5);Salida: true false
El método Number.isSafeInteger()
Un entero seguro es un entero que se puede representar exactamente como un número de doble precisión.
El metodo Number.isSafeInteger() devuelve truesi el argumento es un entero seguro
Ejemplo isSafeInteger()
Number.isSafeInteger(10); Number.isSafeInteger(12345678901234567890);Salida: true false
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias