JavaScript BigInt

JavaScript BigInt 變量用于存儲太大而無法用普通 JavaScript 數字表示的大整數值。

JavaScript 整數精度

JavaScript 整數最多只能精確到 15 位:

整數精度

let x = 999999999999999;
let y = 9999999999999999;

親自試一試

在 JavaScript 中,所有數字都以 64 位浮點格式(IEEE 754 標準)存儲。

根據此標準,大整數無法被精確表示,會被四舍五入。

因此,JavaScript 只能安全地表示以下范圍內的整數:

  • 最大為 9007199254740991(253-1)
  • 最小為 -9007199254740991(-(253-1))

超出此范圍的整數值會失去精度。

如何創建 BigInt

如需創建 BigInt,可以在整數末尾添加 n,或調用 BigInt() 函數:

例子 1

let x = 9999999999999999;
let y = 9999999999999999n;

親自試一試

例子 2

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

親自試一試

BigInt:一種新的 JavaScript 數據類型

BigInt 的 JavaScript 類型是 "bigint":

實例

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

親自試一試

BigInt 是 JavaScript 中的第二個數值數據類型(在 Number 之后)。

對于 BigInt,JavaScript 支持的數據類型總數為 8 種:

  1. String
  2. Number
  3. Bigint
  4. Boolean
  5. Undefined
  6. Null
  7. Symbol
  8. Object

BigInt 運算符

可用于 JavaScript Number 的運算符也可用于 BigInt。

BigInt 乘法實例

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

親自試一試

注意

不允許在 BigInt 和 Number 之間進行算術運算(類型轉換會丟失信息)。

BigInt 無法進行無符號右移操作(>>>),因為它沒有固定的寬度。

BigInt 小數

BigInt 不能有小數。

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;

親自試一試

BigInt 十六進制、八進制和二進制

BigInt 也可以寫成十六進制、八進制或二進制表示法:

BigInt 十六進制實例

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

親自試一試

Precision Curiosity

舍入可能會危及程序安全:

MAX_SAFE_INTEGER 實例

9007199254740992 === 9007199254740993; // 為 true !!!

親自試一試

瀏覽器支持

自 2020 年 9 月以來,所有瀏覽器都支持 BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
2018 年 5 月 2020 年 1 月 2019 年 7 月 2020 年 9 月 2018 年 6 月

最小和最大安全整數

ES6 向 Number 對象添加了 max 和 min 屬性:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER

MAX_SAFE_INTEGER 實例

let x = Number.MAX_SAFE_INTEGER;

親自試一試

MIN_SAFE_INTEGER 實例

let x = Number.MIN_SAFE_INTEGER;

親自試一試

新的數字方法

ES6 還為 Number 對象添加了兩個新方法:

  • Number.isInteger()
  • Number.isSafeInteger()

Number.isInteger() 方法

如果參數是整數,則 Number.isInteger() 方法返回 true

isInteger() 實例

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

親自試一試

Number.isSafeInteger() 方法

安全整數是可以精確表示為雙精度數的整數。

如果參數是安全整數,則 Number.isSafeInteger() 方法返回 true

isSafeInteger() 實例

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

親自試一試

安全整數是從 -(253 - 1) 到 +(253 - 1) 的所有整數。

這是一個安全整數:9007199254740991。這不是一個安全整數:9007199254740992。