JavaScriptLiczby i Math

BigInt

Typ do dokładnych obliczeń na dowolnie dużych liczbach całkowitych. Literały kończą się literą n.

Zwraca
Wartość typu bigint.
Na tej stronie

Przykład

#
JavaScript
const big = 9007199254740993n

console.log(9007199254740993)
console.log(big)
console.log(big + 2n)
console.log(typeof big)
Konsola
9007199254740992
9007199254740993n
9007199254740995n
bigint

Zwykła liczba 9007199254740993 leży poza zakresem dokładnych liczb, więc JavaScript zapisał ją jako najbliższą możliwą wartość, czyli 9007199254740992.

Definicja i zastosowanie

#

Zwykłe liczby w JavaScripcie (typ number) są dokładne tylko do Number.MAX_SAFE_INTEGER, czyli 9007199254740991. Powyżej tej granicy tracą precyzję i sąsiednie liczby całkowite zaczynają się zlewać. BigInt to osobny typ prymitywny, który przechowuje liczby całkowite dowolnej wielkości bez utraty dokładności.

Wartość BigInt tworzysz, dopisując n do liczby (10n), albo funkcją BigInt(), która przyjmuje liczbę całkowitą lub napis z cyframi. Działają zwykłe operatory +, -, *, ** i %, a dzielenie / odcina część ułamkową. typeof 10n zwraca "bigint".

W jednym działaniu nie można mieszać typów: 10n + 1 rzuca TypeError, więc drugą wartość trzeba jawnie zamienić przez BigInt() albo Number(). BigInt nie działa z funkcjami Math, a JSON.stringify() rzuca dla niego błąd. Porównania, np. 10n > 5 czy 2n == 2, działają między typami, ale 2n === 2 zwraca false, bo typy są różne.

Składnia

#
Składnia
123n
BigInt(value)

Parametry

#
  • value

    liczba całkowita lub napis

    Wartość zamieniana na BigInt. Liczba z częścią ułamkową rzuca RangeError, a napis, który nie jest liczbą całkowitą, SyntaxError.

Więcej przykładów

#
Granica bezpiecznych liczb
JavaScript
const max = Number.MAX_SAFE_INTEGER

console.log(max)
console.log(max + 1 === max + 2)
console.log(BigInt(max) + 1n === BigInt(max) + 2n)
Konsola
9007199254740991
true
false
Mieszanie typów i dzielenie
JavaScript
try {
  console.log(10n + 1)
} catch (error) {
  console.log(error.name)
}

console.log(10n + BigInt(1))
console.log(7n / 2n)
console.log(Number(7n) / 2)
Konsola
TypeError
11n
3n
3.5
Duże wyniki bez utraty cyfr
JavaScript
function factorial(n) {
  let result = 1n
  for (let i = 2n; i <= n; i++) {
    result *= i
  }
  return result
}

console.log(factorial(25n))
console.log(Number(factorial(25n)))
Konsola
15511210043330985984000000n
1.5511210043330986e+25

Obsługa przeglądarek

#

Szeroko dostępne · od 2020 roku

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Identyfikatory z baz danych i API, które przekraczają Number.MAX_SAFE_INTEGER, trzymaj jako napisy albo BigInt. Zamiana na zwykłą liczbę po cichu zmieni ostatnie cyfry.
  • Przed wysłaniem danych jako JSON zamień BigInt na napis, np. przez value.toString(). JSON.stringify() nie obsługuje tego typu i rzuca TypeError.
  • BigInt nie ma części ułamkowej. Kwoty zapisuj w groszach i pamiętaj, że dzielenie zawsze ucina wynik do liczby całkowitej.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.