BigInt do JavaScript

As variáveis BigInt do JavaScript são usadas para armazenar valores inteiros muito grandes que não podem ser representados por números normais do JavaScript.

Precisão de Inteiros do JavaScript

Os inteiros no JavaScript podem ter no máximo 15 dígitos de precisão:

Precisão de Inteiros

let x = 999999999999999;
let y = 9999999999999999;

Experimente você mesmo

No JavaScript, todos os números são armazenados em formato de ponto flutuante de 64 bits (padrão IEEE 754).

De acordo com esse padrão, inteiros grandes não podem ser representados com precisão e serão arredondados.

Portanto, o JavaScript só pode representar inteiros dentro do seguinte intervalo de maneira segura:

  • o maior é 9007199254740991(253-1)
  • o menor é -9007199254740991(-(253-1))

Valores inteiros fora deste intervalo perdem precisão.

Como criar BigInt

Para criar BigInt, você pode adicionar n,ou chame BigInt() Função:

Exemplo 1

let x = 9999999999999999;
let y = 9999999999999999n;

Experimente você mesmo

Exemplo 2

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

Experimente você mesmo

BigInt: um novo tipo de dados do JavaScript

O tipo do JavaScript de BigInt é "bigint

Exemplo

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

Experimente você mesmo

BigInt é o segundo tipo de dados numéricos no JavaScript (após Number).

Para BigInt, o JavaScript suporta um total de 8 tipos de dados:

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

Operadores BigInt

Os operadores usados para o tipo Number do JavaScript também podem ser usados para BigInt.

Exemplo de Multiplicação de BigInt

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

Experimente você mesmo

Atenção

Não é permitido realizar operações aritméticas entre BigInt e Number (a conversão de tipo perderá informações).

BigInt não pode realizar operações de deslocamento à direita sem sinal (>>>), pois não tem largura fixa.

Casa decimal de BigInt

BigInt não pode ter casa decimal.

Exemplo de divisão de BigInt

let x = 5n;
let y = x / 2;
// Erro: Não é possível misturar BigInt e outros tipos, use conversão explícita.
let x = 5n;
let y = Number(x) / 2;

Experimente você mesmo

BigInt hexadecimal, octal e binário

BigInt também pode ser escrito em representação hexadecimal, octal ou binária:

Instância hexadecimal de BigInt

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

Experimente você mesmo

Curiosidade de Precisão

A arredondamento pode comprometer a segurança do programa:

Instância de MAX_SAFE_INTEGER

9007199254740992 === 9007199254740993; // true !!!

Experimente você mesmo

Suporte do navegador

Desde setembro de 2020, todos os navegadores suportam BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
Maio de 2018 Janeiro de 2020 Julho de 2019 Setembro de 2020 Junho de 2018

Inteiros seguros mínimo e máximo

O ES6 adicionou as propriedades max e min ao objeto Number:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER

Instância de MAX_SAFE_INTEGER

let x = Number.MAX_SAFE_INTEGER;

Experimente você mesmo

Instância de MIN_SAFE_INTEGER

let x = Number.MIN_SAFE_INTEGER;

Experimente você mesmo

Novos métodos numéricos

O ES6 adicionou dois novos métodos ao objeto Number:

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

Método Number.isInteger()

Se o parâmetro for um inteiro, o método Number.isInteger() retorna true.

Exemplo isInteger()

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

Experimente você mesmo

Método Number.isSafeInteger()

Inteiros seguros são inteiros que podem ser representados com precisão como números de precisão dupla.

Se o parâmetro for um inteiro seguro, o método Number.isSafeInteger() retorna true.

Exemplo isSafeInteger()

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

Experimente você mesmo

Inteiros seguros são inteiros de -(253 de -1) a +253 de -1) todos os inteiros.

Este é um inteiro seguro: 9007199254740991. Este não é um inteiro seguro: 9007199254740992.