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就像派一樣簡單。你有兩種選擇:
- 在整數末尾添加'n'
- 使用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