Jaká je nejvyšší celočíselná hodnota JavaScriptu, na kterou může číslo přejít bez ztráty přesnosti?

Je to definováno jazykem? Je nějaké definované maximum? Liší se to v různých prohlížečích?

Odpověď

JavaScript má dva typy čísel:Number a BigInt .

Nejčastěji používaný typ čísla, Number , je 64bitové číslo IEEE 754 s plovoucí desetinnou čárkou.

Největší přesná integrální hodnota tohoto typu je Number.MAX_SAFE_INTEGER , což je:

  • 2 53 -1 nebo
  • +/- 9 007 199 254 740 991 nebo
  • devět kvadrilionů sedm bilionů sto devadesát devět miliard dvě stě padesát čtyři milionů sedm set čtyřicet tisíc devět set devadesát jedna

Pro představu:jeden kvadrilion bajtů je petabajt (nebo tisíc terabajtů).

„Bezpečný“ v tomto kontextu označuje schopnost přesně reprezentovat celá čísla a správně je porovnávat.

Ze specifikace:

Všimněte si, že všechna kladná a záporná celá čísla, jejichž velikost není větší než 2 53 jsou reprezentovatelné v Number typ (ve skutečnosti celé číslo 0 má dvě reprezentace, +0 a -0).

Chcete-li bezpečně používat celá čísla větší než toto, musíte použít BigInt , která nemá horní hranici.

Všimněte si, že bitové operátory a operátory shift pracují na 32bitových celých číslech, takže v takovém případě je maximální bezpečné celé číslo 2 31 -1 nebo 2,147,483,647.

const log = console.log
var x = 9007199254740992
var y = -x
log(x == x + 1) // true !
log(y == y - 1) // also true !

// Arithmetic operators work, but bitwise/shifts only operate on int32:
log(x / 2)      // 4503599627370496
log(x >> 1)     // 0
log(x | 1)      // 1

Technická poznámka k číslu 9 007 199 254 740 992:Existuje přesná reprezentace této hodnoty IEEE-754 a tuto hodnotu můžete přiřadit a číst z proměnné, takže pro velmi opatrně vybrané aplikace v doméně celých čísel menších nebo rovných této hodnotě, můžete to považovat za maximální hodnotu.

V obecném případě musíte tuto hodnotu IEEE-754 považovat za nepřesnou, protože není jednoznačné, zda kóduje logickou hodnotu 9 007 199 254 740 992 nebo 9 007 199 254 740 993.