JavaScript - BigInt:處理真正的大數字

你好,有抱負的編程者們!今天,我們將踏上一段令人興奮的旅程,探索JavaScript中真正、真正大的數字的世界。請系好安全帶,因為我們即將探索令人著迷的BigInt領域!

JavaScript - BigInt

BigInt是什麼?

想像你在數夜空中的星星。你數啊數,但突然你的計算器說「無窮大」。令人沮喪,對吧?這就是BigInt出來救援的時候!

BigInt是JavaScript中的一種特殊數字類型,可以表示任意長度的整數。與有限制的普通數字不同,BigInt可以處理你的想像力(或你的電腦記憶)允許的任何大小的數字。

我們為什麼需要BigInt?

在JavaScript中,普通數字以64位儲存,這意味著它們的最大安全整數值為9,007,199,254,740,991。這是一個很大的數字,但在計算世界中,有時我們需要更大!

讓我們看看當我們嘗試超過這個限制時會發生什麼:

console.log(9007199254740991n + 1n); // 9007199254740992n
console.log(9007199254740991n + 2n); // 9007199254740992n (哦哦!結果相同)

正如你所看到的,JavaScript無法準確表示這個限制之外的數字。這就是BigInt的亮點!

宣告和初始化

創建一個BigInt就像派一樣簡單。你有兩種選擇:

  1. 在整數末尾添加'n'
  2. 使用BigInt()函數

讓我們試一試:

const bigNumber1 = 1234567890123456789012345678901234567890n;
const bigNumber2 = BigInt("9007199254740991");

console.log(bigNumber1); // 1234567890123456789012345678901234567890n
console.log(bigNumber2); // 9007199254740991n

注意到末尾的'n'了嗎?這是JavaScript知道它是BigInt的方式!

基本操作

現在我們有了我們的大數字,讓我們來做一些數學運算!

const a = 1234567890n;
const b = 9876543210n;

console.log(a + b);  // 11111111100n
console.log(a - b);  // -8641975320n
console.log(a * b);  // 12193263111263526900n
console.log(a / b);  // 0n (整數除法)
console.log(a % b);  // 1234567890n

記住,BigInt總是整數。當除法時,結果會向下取整到最接近的整數。

比較

比較BigInt就像比較普通數字一樣:

console.log(5n > 4n);   // true
console.log(5n < 4n);   // false
console.log(5n === 5);  // false (不同的類型)
console.log(5n == 5);   // true (類型強制)

注意最後兩行。當使用==時,BigInt和普通數字被認為是相等的,但當使用===時則不然。這是因為===檢查值和類型的相等性。

轉換

有時你需要將BigInt和普通數字之間進行轉換。這樣做:

const bigNum = 123456789n;
const regularNum = Number(bigNum);

console.log(regularNum);  // 123456789

const backToBigInt = BigInt(regularNum);
console.log(backToBigInt);  // 123456789n

在將大的BigInt轉換為普通數字時要小心,因為你可能會丟失精度!

示例

讓我們將我們的BigInt知識應用於一些真實世界的例子:

1. 計算階乘

function factorial(n) {
if (n === 0n) return 1n;
return n * factorial(n - 1n);
}

console.log(factorial(20n));  // 2432902008176640000n

這個函數可以計算遠遠大於普通JavaScript數字能夠計算的階乘!

2. 使用真正大的質數

function isPrime(n) {
if (n <= 1n) return false;
for (let i = 2n; i * i <= n; i++) {
if (n % i === 0n) return false;
}
return true;
}

const largeNumber = 2n ** 100n - 1n;
console.log(isPrime(largeNumber) ? "質數" : "非質數");  // 非質數

這個函數可以檢查遠遠超出普通JavaScript數字限制的數字的質數性!

BigInt的錯誤處理

當使用BigInt時,有一些事情需要注意:

try {
const result = 1n + 1;  // 這會抛出錯誤
} catch (error) {
console.log("錯誤:", error.message);  // 不能將BigInt和其他類型混合
}

try {
const result = Math.sqrt(4n);  // 這也會抛出錯誤
} catch (error) {
console.log("錯誤:", error.message);  // 不能將BigInt值轉換為數字
}

記住,BigInt只能與其他BigInt進行算術運算,而且許多Math函數不支持BigInt。

BigInt方法

這裡是最常用的BigInt方法的表格:

方法 描述 示例
BigInt() 創建一個BigInt值 BigInt(123)
BigInt.asIntN() 將BigInt值包絡到 signed integer 之間 -2^(n-1) 和 2^(n-1)-1 BigInt.asIntN(3, 5n) // 5n
BigInt.asUintN() 將BigInt值包絡到 unsigned integer 之間 0 和 2^n-1 BigInt.asUintN(3, 5n) // 5n
BigInt.prototype.toString() 返回BigInt值的字符串表示 (123n).toString() // "123"
BigInt.prototype.valueOf() 返回BigInt對象的原始值 Object(123n).valueOf() // 123n

現在,各位,你已經裝備好了處理比星空中的星星還要大的數字的能力。記住,能力越大,責任越大 - 聰明地使用你的BigInt!

開心地編程,願你的數字永遠與你的夢想一樣宏大!

Credits: Image by storyset