BigInt w JavaScript

Zmienne BigInt w JavaScript są używane do przechowywania wartości całkowitych, które są zbyt duże, aby być reprezentowanymi przez zwykłe liczby JavaScript.

Dokładność liczb całkowitych w JavaScript

JavaScript może dokładnie reprezentować liczby całkowite tylko do 15 miejsc po przecinku:

Dokładność liczb całkowitych

let x = 999999999999999;
let y = 9999999999999999;

Spróbuj sam

W JavaScript wszystkie liczby są przechowywane w formacie 64-bitowego formatu zmiennoprzecinkowego (standard IEEE 754).

Zgodnie z tym standardem, duże liczby całkowite nie mogą być dokładnie reprezentowane i są zaokrąglane.

Dlatego JavaScript może bezpiecznie reprezentować tylko liczby całkowite w następującym zakresie:

  • największa 9007199254740991(253-1)
  • najmniejsza -9007199254740991(-(253-1))

Liczby całkowite poza tym zakresem tracą dokładność.

Jak utworzyć BigInt

Aby utworzyć BigInt, można dodać nlub wywołanie BigInt() Funkcja:

Przykład 1

let x = 9999999999999999;
let y = 9999999999999999n;

Spróbuj sam

Przykład 2

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

Spróbuj sam

BigInt: nowy typ danych w JavaScript

Typ JavaScript dla BigInt to "bigint

Przykład

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

Spróbuj sam

BigInt jest drugim typem liczbowym w JavaScript (po Number).

Dla BigInt, liczba typów danych obsługiwanych przez JavaScript wynosi 8:

  1. Ciąg znaków
  2. Liczba
  3. Bigint
  4. Logiczny
  5. Nieokreślona
  6. Pusta
  7. Symbol
  8. Obiekt

Operatorzy BigInt

Operatorzy dostępne dla JavaScript Number można również używać z BigInt.

Przykład mnożenia BigInt

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

Spróbuj sam

Uwaga

Nie można wykonywać operacji arytmetycznych (konwersji typów) między BigInt a Number (konwersja typu może utracić informacje).

BigInt nie może wykonywać operacji przesunięcia w prawo bez znaku (>>>), ponieważ nie ma stałej szerokości.

Ułamki BigInt

BigInt nie może mieć ułamków.

Przykład dzielenia BigInt

let x = 5n;
let y = x / 2;
// Błąd: Nie można mieszać BigInt i innych typów, użyj wyraźnej konwersji.
let x = 5n;
let y = Number(x) / 2;

Spróbuj sam

BigInt w formacie szesnastkowego, ósemkowego i dwójkowego

BigInt może być również zapisany w formacie szesnastkowego, ósemkowego lub dwójkowego:

Przykład BigInt w formacie szesnastkowym

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

Spróbuj sam

Precision Curiosity

Zaokrąglanie może zagrażać bezpieczeństwu programu:

Przykład MAX_SAFE_INTEGER

9007199254740992 === 9007199254740993; // To prawda !!!

Spróbuj sam

Wsparcie przeglądarek

Od września 2020 roku wszystkie przeglądarki wspierają BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
Maj 2018 roku Styczeń 2020 roku Lipiec 2019 roku Wrzesień 2020 roku Czerwiec 2018 roku

Najmniejsza i największa liczba bezpieczna

ES6 dodaje również atrybuty max i min do obiektu Number:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER

Przykład MAX_SAFE_INTEGER

let x = Number.MAX_SAFE_INTEGER;

Spróbuj sam

Przykład MIN_SAFE_INTEGER

let x = Number.MIN_SAFE_INTEGER;

Spróbuj sam

Nowe metody liczbowe

ES6 dodaje również dwa nowe metody do obiektu Number:

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

Metoda Number.isInteger()

Jeśli parametr jest liczbą całkowitą, metoda Number.isInteger() zwraca true.

Przykład isInteger()

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

Spróbuj sam

Metoda Number.isSafeInteger()

Bezpieczne liczby całkowite to liczby całkowite, które można dokładnie wyrazić jako liczby zmiennoprzecinkowe.

Jeśli parametr jest bezpiecznym liczbą całkowitą, metoda Number.isSafeInteger() zwraca true.

Przykład isSafeInteger()

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

Spróbuj sam

Bezpieczne liczby całkowite to liczby całkowite z zakresu -(253 - 1) do +(253 - 1) wszystkich liczb całkowitych.

To jest bezpieczny整数:9007199254740991. To nie jest bezpieczny整数:9007199254740992.