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.