JavaScript - BigInt: Handling Really Big Numbers
こんにちは、未来のプログラマーさんたち!今日は、JavaScriptの世界で非常に大きな数を扱う興奮する旅に出かけます。シートベルトを締めて、BigIntの魅力的な領域に飛び込んでみましょう!
What is BigInt?
星を数えていると、突然計算機が「無限大」と表示するかもしれません。フラストレーションが溜まりますよね?それがBigIntが登場する場です!
BigIntは、任意の長さの整数を表現できるJavaScriptの特別な数値型です。通常の数とは異なり、制限がないため、あなたの想像力(またはコンピュータのメモリ)に応じて非常に大きな数を扱うことができます。
Why do we need BigInt?
JavaScriptでは、通常の数は64ビットで保存されており、最大の安全な整数値は9,007,199,254,740,991です。これは大きな数ですが、計算の世界ではもっと大きな数が必要な場合があります!
この制限を超えるとどうなるか見てみましょう:
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992 (同じ結果)
JavaScriptはこの制限を超える数を正確に表現できません。ここでBigIntが輝きます!
Declaration and Initialization
BigIntを作成するのは簡単です。以下の2つの方法があります:
- 整数の末尾に 'n' を追加する
- BigInt()関数を使用する
両方を試してみましょう:
const bigNumber1 = 1234567890123456789012345678901234567890n;
const bigNumber2 = BigInt("9007199254740991");
console.log(bigNumber1); // 1234567890123456789012345678901234567890n
console.log(bigNumber2); // 9007199254740991n
末尾の 'n' に注意してください。これでJavaScriptがそれがBigIntであることを認識します!
Basic Operations
大きな数を手に入れたので、少し数学をしましょう!
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は常に整数です。除法を行う際には、結果は最も近い整数に丸めされます。
Comparison
BigIntの比較は通常の数と同じです:
console.log(5n > 4n); // true
console.log(5n < 4n); // false
console.log(5n === 5); // false (異なる型)
console.log(5n == 5); // true (型変換)
最後の2行に注意してください。BigIntと通常の数は ==
を使用すると等しいと見なされますが、===
を使用すると等しくありません。これは ===
が値と型の両方を確認するためです。
Conversions
時々、BigIntと通常の数の間で変換する必要があります。以下のようにします:
const bigNum = 123456789n;
const regularNum = Number(bigNum);
console.log(regularNum); // 123456789
const backToBigInt = BigInt(regularNum);
console.log(backToBigInt); // 123456789n
大きなBigIntを通常の数に変換する際には、精度を失う可能性があることに注意してください!
Examples
実際の例でBigIntの知識を活かしてみましょう:
1. Calculating Factorials
function factorial(n) {
if (n === 0n) return 1n;
return n * factorial(n - 1n);
}
console.log(factorial(20n)); // 2432902008176640000n
この関数は、通常のJavaScriptの数では計算不可能な非常に大きな数の階乗を計算できます!
2. Working with Really Large Prime Numbers
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) ? "Prime" : "Not Prime"); // Not Prime
この関数は、通常のJavaScriptの数の限界を超える数の素数判定ができます!
Error Handling with BigInt
BigIntを使用する際には、以下の点に注意してください:
try {
const result = 1n + 1; // これはエラーを発生します
} catch (error) {
console.log("Error:", error.message); // Cannot mix BigInt and other types
}
try {
const result = Math.sqrt(4n); // これはもともとエラーを発生します
} catch (error) {
console.log("Error:", error.message); // Cannot convert a BigInt value to a number
}
Remember, BigInts can only be used with other BigInts for arithmetic operations, and many Math functions don't support BigInts.
BigInt Methods
以下は、最も一般的に使用されるBigIntメソッドの表です:
Method | Description | Example |
---|---|---|
BigInt() | Creates a BigInt value | BigInt(123) |
BigInt.asIntN() | Wraps a BigInt value to a signed integer between -2^(n-1) and 2^(n-1)-1 | BigInt.asIntN(3, 5n) // 5n |
BigInt.asUintN() | Wraps a BigInt value to an unsigned integer between 0 and 2^n-1 | BigInt.asUintN(3, 5n) // 5n |
BigInt.prototype.toString() | Returns a string representation of a BigInt value | (123n).toString() // "123" |
BigInt.prototype.valueOf() | Returns the primitive value of a BigInt object | Object(123n).valueOf() // 123n |
そして、皆さん!大きな数を扱う力を手に入れました。大きな力には大きな責任が伴います - BigIntを賢く使用しましょう!
ハッピーコーディング、そしてあなたの夢がいつも大きな数であることを願っています!
Credits: Image by storyset