JavaScript BigInt


Indholdsfortegnelse

    Vis indholdsfortegnelse

JavaScript BigInt-variabler bruges til at gemme store heltalsværdier der er for store til at blive repræsenteret af et normalt nummer JavaScript.

JavaScript-heltalsnøjagtighed

JavaScript-heltal er kun nøjagtige op til 15 cifre:

Heltals præcision

let x = 999999999999999;
let y = 9999999999999999;

Prøv det selv →

<!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>


I JavaScript er alle tal gemt i et 64-bit flydende komma-format (IEEE 754-standard).

Med denne standard kan stort heltal ikke repræsenteres nøjagtigt og vil blive afrundet.

På grund af dette kan JavaScript kun sikkert repræsentere heltal:

Op til 9007199254740991 +(253-1)

og

Ned til -9007199254740991 -(253-1).

Heltalsværdier uden for dette interval mister præcision.


Sådan opretter du en BigInt

For at oprette en BigInt skal du tilføje n til slutningen af et heltal eller et opkald BigInt():

Eksempler

let x = 9999999999999999;
let y = 9999999999999999n;

Prøv det selv →

<!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)

Prøv det selv →

<!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: En ny JavaScript-datatype

JavaScript type en BigInt er "bigint":

Eksempel

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

Prøv det selv →

<!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 er den anden numeriske datatype i JavaScript (efter Nummer).

Med BigInt er det samlede antal understøttede datatyper i JavaScript 8:

1. Streng
2. Nummer
3. Bigint
4. Boolean
5. Udefineret
6. Nul
7. Symbol
8. Objekt


BigInt-operatører

Operatører, der kan bruges på et JavaScript nummer kan også bruges på en BigInt.

BigInt multiplikationseksempel

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

Prøv det selv →

<!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>

Noter

Aritmetik mellem en BigInt og et nummer er ikke tilladt (type konvertering tab information).

Usigneret højreskift (>>>) kan ikke udføres på en BigInt (den har ikke en fast bredde).


BigInt decimaler

En BigInt kan ikke have decimaler.

Eksempel på BigInt Division

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;

Prøv det selv →

<!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, Oktal og Binær

BigInt kan også skrives i hexadecimal, oktal eller binær notation:

BigInt Hex eksempel

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

Prøv det selv →

<!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>

Præcisionsnysgerrighed

Afrunding kan kompromittere programsikkerheden:

MAX_SAFE_INTEGER Eksempel

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

Prøv det selv →

<!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>

Browser support

BigInt er understøttet i alle browsere siden september 2020:

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


Minimum og maksimum sikre heltal

ES6 tilføjede max og min egenskaber til Number-objektet:

  • MAX_SAFE_INTEGER

  • MIN_SAFE_INTEGER

MAX_SAFE_INTEGER Eksempel

let x = Number.MAX_SAFE_INTEGER;

Prøv det selv →

<!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>

MIN_SAFE_INTEGER Eksempel

let x = Number.MIN_SAFE_INTEGER;

Prøv det selv →

<!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>

Nye talmetoder

ES6 tilføjede også 2 nye metoder til Number-objektet:

  • Number.isInteger()

  • Number.isSafeInteger()


Number.isInteger()-metoden

Metoden Number.isInteger() returnerer true, hvis argumentet er et heltal.

Eksempel: isInteger()

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

Prøv det selv →

<!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>

Number.isSafeInteger()-metoden

Et sikkert heltal er et heltal, der nøjagtigt kan repræsenteres som et dobbelt præcisionstal.

Metoden Number.isSafeInteger() returnerer true, hvis argumentet er et sikkert heltal.

Eksempel erSafeInteger()

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

Prøv det selv →

<!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>

Sikre heltal er alle heltal fra -(253 - 1) til +(253 - 1).
Dette er sikkert: 9007199254740991. Dette er ikke sikkert: 9007199254740992.