BigInt ใน JavaScript

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 ตัวเลขทั้งหมดของบราวเซอร์สนับสนุน BigInt:

Chrome Edge Firefox Safari Opera
Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
พฤษภาคม 2018 ปี มกราคม 2020 ปี กรกฎาคม 2019 ปี กันยายน 2020 ปี มิถุนายน 2018 ปี

ตัวเลขที่ปลอดภัยที่สุดและต่ำที่สุด

ES6 ยังเพิ่ม 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