20-Bigint en Javascript

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





Publicar un comentario

0 Comentarios