Números inteiros gigantes com `BigInt` no JavaScript

Números / Tutorial JavaScript

O BigInt é um tipo de dado usado para representar números inteiros extremamente grandes com precisão total. Ele é especialmente útil quando precisamos lidar com números maiores do que o tipo number pode representar.

O tipo number no JavaScript é baseado em ponto flutuante e possui limitações para representar números inteiros maiores que 2^53 - 1 ou menores que -(2^53 - 1). O BigInt supera essas limitações, permitindo trabalhar com números inteiros de qualquer tamanho.

Para criar um valor BigInt, basta adicionar a letra n ao final do número.

Criando valores BigInt

Exemplo 1:

let numeroGrande = 123456789012345678901234567890n

Também é possível criar valores BigInt usando a função BigInt(), que é útil para conversões de outros tipos, como string ou number.

Exemplo 2:

let inteiro1 = BigInt(12345) // Conversão de number para BigInt
let inteiro2 = BigInt('12345') // Conversão de string para BigInt

Operações aritméticas com BigInt

O BigInt suporta todas as operações aritméticas padrão, como adição, subtração, multiplicação, divisão e potenciação. Essas operações mantêm a precisão completa, sem arredondamento ou perda de dados.

Exemplo 1:

console.log(10n + 10n)  // 20n
console.log(10n - 10n)  // 0n
console.log(10n * 10n)  // 100n
console.log(10n / 10n)  // 1n
console.log(10n ** 10n) // 10000000000n
console.log(10n % 10n)  // 0n

As operações com BigInt são especialmente úteis para números muito grandes.

Exemplo 2:

let resultado = 2n ** 70n // 1180591620717411303424n

Aqui, 2 elevado à potência de 70 resulta em um número extremamente grande, que é representado com precisão pelo BigInt.

Atenção: Divisões com BigInt não permitem valores fracionados. O resultado será arredondado para o inteiro mais próximo.

Exemplo 3:

console.log(5n / 2n) // 2n

Neste caso, o resultado é 2n, pois o BigInt não suporta valores decimais.


Operações de comparação com BigInt

O BigInt suporta operadores de comparação como >, <, >=, <=, === e !==.

Exemplo 1:

console.log(10n < 20n)   // true
console.log(10n > 20n)   // false
console.log(10n !== 20n) // true
console.log(10n === 20n) // false

Os operadores de comparação também funcionam entre valores number e BigInt, mas é importante ter cuidado com os operadores de igualdade estrita (=== e !==), pois eles levam em conta o tipo.

Exemplo 2:

console.log(500 === 500n) // false
console.log(500 == 500n)  // true

Conversões numéricas com BigInt()

A função BigInt() permite converter valores de outros tipos, como number ou string, para BigInt.

Exemplo 1:

// Conversão de diferentes formatos para BigInt
let bigint1 = BigInt(1000000000) // De number
let bigint2 = BigInt('1000000000') // De string
let bigint3 = BigInt('0x3b9aca00') // De hexadecimal
let bigint4 = BigInt('0b111011100110101100101000000000') // De binário

console.log(bigint1 === bigint2) // true
console.log(bigint2 === bigint3) // true
console.log(bigint3 === bigint4) // true

Neste exemplo, diferentes representações do mesmo número são convertidas para BigInt e comparadas, resultando em valores equivalentes.

Atenção: Ao converter um BigInt para number, você pode perder precisão se o valor for muito grande.

Exemplo 2:

let big = 123456789012345678901234567890n
let numero = Number(big)

console.log(BigInt(numero) === big) // false

Aqui, a conversão de BigInt para number resulta em perda de precisão, pois o tipo number não consegue representar o valor original com exatidão.


O BigInt é uma ferramenta poderosa para lidar com números inteiros gigantes, mas deve ser usado com cuidado, especialmente ao realizar operações que envolvem outros tipos de dados. Escolher o tipo de dado correto para cada situação é essencial para garantir a precisão e a lógica do seu programa.