JavaScript BigInt


Obsah

    Zobrazit obsah

Proměnné BigInt JavaScriptu se používají k ukládání hodnot velkých celých čísel které jsou příliš velké na to, aby je reprezentovalo běžné číslo JavaScriptu.

Přesnost celého čísla JavaScriptu

Celá čísla JavaScriptu jsou přesná pouze do 15 číslic:

Přesnost celého čísla

let x = 999999999999999;
let y = 9999999999999999;

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Integer Precision</h2>

<p>Integers (numbers without a period or exponent notation) are accurate up to 15 digits:</p>

<p id="demo"></p>

<script>
let x = 999999999999999;
let y = 9999999999999999;
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>


V JavaScriptu jsou všechna čísla uložena v 64bitovém formátu s plovoucí desetinnou čárkou (standard IEEE 754).

S tímto standardem nelze velké celé číslo přesně reprezentovat a bude zaokrouhleno.

Z tohoto důvodu může JavaScript bezpečně reprezentovat pouze celá čísla:

9007199254740991 +(253-1)

a

Až na -9007199254740991 -(253-1).

Celočíselné hodnoty mimo tento rozsah ztrácejí přesnost.


Jak vytvořit BigInt

Chcete-li vytvořit BigInt, připojte n na konec celého čísla nebo volání BigInt():

Příklady

let x = 9999999999999999;
let y = 9999999999999999n;

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Integer and BigInt</h2>

<p id="demo"></p>

<script>
let x = 9999999999999999;
let y = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>


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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Create a BigInt</h2>

<p id="demo"></p>

<script>
let x = 123456789012345678901234567890n;
let y = BigInt("123456789012345678901234567890");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>



BigInt: Nový datový typ JavaScriptu

JavaScript typeof a BigInt je "bigint":

Příklad

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>BigInt typeof</h2>

<p>The typeof a BigInt is:</p>
<p id="demo"></p>

<script>
let x = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = typeof x;
</script>

</body>
</html>


BigInt je druhý číselný datový typ v JavaScriptu (za číslo).

S BigInt je celkový počet podporovaných datových typů v JavaScriptu 8:

1. Řetězec
2. Číslo
3. Bigint
4. Logická hodnota
5. Nedefinováno
6. Null
7. Symbol
8. Objekt


Operátoři BigInt

Operátory, které lze použít na číslo JavaScriptu lze také použít na BigInt.

Příklad násobení BigInt

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>BigInt Multiply</h2>
<p>Operators that can be used a Number can be used on a BigInt.</p>
<p id="demo"></p>

<script>
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

document.getElementById("demo").innerHTML = z; 
</script>

</body>
</html>

Poznámky

Aritmetika mezi BigInt a Číslo není povoleno (převod typu ztratí informace).

Nepodepsaný posun doprava (>>>) nelze provést na BigInt (nemá pevnou šířku).


BigInt desetinná místa

BigInt nemůže mít desetinná místa.

Příklad divize BigInt

let x = 5n;
let y = x / 2;
// Error: Cannot mix BigInt and other types, use explicit conversion.
let x = 5n;
let y = Number(x) / 2;

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>BigInt Divide</h2>

<p>A BigInt can not have decimals.</p>
<p>Cannot mix BigInt and other types, use explicit conversions.</p>
<p id="demo"></p>

<script>
let x = 5n;
let y = Number(x) / 2;

document.getElementById("demo").innerHTML = y; 
</script>

</body>
</html>

BigInt Hex, osmičkové a binární

BigInt lze také zapsat v hexadecimálním, osmičkovém nebo binárním zápisu:

Příklad BigInt Hex

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>Hex, Octal and Binary</h2>

<p id="demo"></p>


<script>
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

document.getElementById("demo").innerHTML = hex + "<br>" + oct + "<br>" + bin; 
</script>

</body>
</html>

Precizní zvědavost

Zaokrouhlení může ohrozit zabezpečení programu:

Příklad MAX_SAFE_INTEGER

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Numbers</h1>
<h2>Integer Precision</h2>

<p>Is 9007199254740992 equal to 9007199254740993?</p>

<p id="demo"></p>


<script>
let x = 9007199254740992 === 9007199254740993;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

Podpora prohlížeče

BigInt je podporován ve všech prohlížečích od září 2020:

Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
May 2018 Jan 2020 Jul 2019 Sep 2020 Jun 2018


Minimální a maximální bezpečná celá čísla

ES6 přidal vlastnosti max a min do objektu Number:

  • MAX_SAFE_INTEGER

  • MIN_SAFE_INTEGER

Příklad MAX_SAFE_INTEGER

let x = Number.MAX_SAFE_INTEGER;

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h2>Number Object Properties</h2>

<p>MAX_SAFE_INTEGER</p>

<p id="demo"></p>

<script>
let  x = Number.MAX_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

Příklad MIN_SAFE_INTEGER

let x = Number.MIN_SAFE_INTEGER;

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h2>Number Object Properties</h2>

<p>MIN_SAFE_INTEGER</p>

<p id="demo"></p>

<script>
let  x = Number.MIN_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

Nové číselné metody

ES6 také přidal 2 nové metody do objektu Number:

  • Number.isInteger()

  • Number.isSafeInteger()


Metoda Number.isInteger().

Pokud je argument celé číslo, metoda Number.isInteger() vrátí true.

Příklad: isInteger()

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>The isInteger() Method</h2>

<p>The isInteger() method returns true if the argument is an integer.</p>
<p>Otherwise it returns false.</p>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML =
Number.isInteger(10) + "<br>" + Number.isInteger(10.5);
</script>

</body>
</html>

Metoda Number.isSafeInteger().

Bezpečné celé číslo je celé číslo, které lze přesně vyjádřit jako číslo s dvojnásobnou přesností.

Pokud je argumentem bezpečné celé číslo, metoda Number.isSafeInteger() vrací true.

Příklad isSafeInteger()

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

Zkuste to sami →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>The isSafeInteger() Method</h2>

<p>The isSafeInteger() method returns true if the argument is a safe integer.</p>
<p>Otherwise it returns false.</p>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML =
Number.isSafeInteger(10) + "<br>" + Number.isSafeInteger(12345678901234567890);
</script>

</body>
</html>

Bezpečná celá čísla jsou celá čísla od -(253 - 1) do +(253 - 1).
Toto je bezpečné: 9007199254740991. Toto není bezpečné: 9007199254740992.