1. BigInt(長整数)って何?
- BigInt は「とても大きな整数」を正確に扱える新しい数の型(プリミティブ)です。整数リテラルの末尾に
nを付けるか、BigInt()を使って作ります。
例:
const a = 123n; // リテラル(末尾に n)
const b = BigInt("456"); // コンストラクタからも作れる
JavaScript2. なぜ BigInt を使うの?(必要性の直感)
- 普通の
Number(IEEE754 の浮動小数点)は 安全に扱える整数が2^53 - 1(= 9007199254740991)まで と決まっています。これを超えると整数の加算などで誤差(丸めによる不整合)が出ます。大きな ID、暗号、台帳、精度が絶対必要な整数計算には BigInt が便利です。
例(Number の問題):
const max = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(max + 1); // 9007199254740992 (見た目は良さそう)
console.log(max + 2); // 9007199254740992 ← 本当は +2 で増えるはずなのに増えない
JavaScriptBigInt なら期待どおり:
const big = 9007199254740991n;
console.log(big + 1n); // 9007199254740992n
console.log(big + 2n); // 9007199254740993n
JavaScript3. 書き方(リテラル・他の基数表記・区切り)
- 10進リテラル:
123n - 16進/8進/2進 も同様に
nを付ける:0xFFn,0o77n,0b1010n。developer.mozilla.org+1 - 大きな桁の読みやすさのために Numeric separator(
_) が使えます(例:1_000_000n)。JavaScript Primer BigInt()に文字列や Number を渡して作ることも可能:BigInt("12345678901234567890")。
4. 演算(基本) — 普通の数と似てるけど違いもある
使える演算
- 加算
+、減算-、乗算*、べき乗**、剰余%、ビット演算(& | ^ ~ << >>)などは使えます(ただしいくつかの例外あり)。
例:
console.log(2n + 3n); // 5n
console.log(2n ** 10n); // 1024n
console.log(10n % 3n); // 1n
JavaScript切り捨て式の割り算
/(除算)は 小数を表現できないため切り捨て(0 に向かって丸め) されます。つまり5n / 2nは2nになります。0nで割るとRangeError(例外)になるので注意。
5. BigInt と Number を混ぜると?(重要)
- 注意:BigInt と普通の Number を算術演算で混ぜると TypeError が出ます。 自動でどちらかに合わせてくれないので、自分で
BigInt()かNumber()で明示的に変換してください。
例(エラー):
1n + 2 // TypeError: can't convert BigInt to number
JavaScript直す方法:
1n + BigInt(2) // -> 3n
Number(1n) + 2 // -> 3
JavaScriptどちらに変換するかは「精度を保ちたいか(BigInt)」か「小数が必要か(Number)」で決めます。大きすぎる BigInt を
Number()に変換すると精度が失われることがあります。
6. 比較・等価判定の挙動
比較(<, >, <=, >=)は Number と BigInt の混在でも動作します(数値として比較)。
しかし 厳密等価(===)では型が違うので 0n === 0 は false。一方、抽象等価(==)だと 0n == 0 は true になります(内部で型変換を試みる)。
7. 実用で気をつけるポイント(よくある罠)
Mathの関数は使えない(Math.max(1n,2n)は動きません)。必要ならNumber()に変換するか、専用ライブラリを使う。JSON.stringifyは BigInt を直接シリアライズできない(エラーになる)。送受信する場合は文字列に変換するなど対処が必要。- 一部の演算子は BigInt と相性悪い(例えば
>>>(符号なし右シフト)は BigInt ではサポートされない)。
対処例(JSON):
const obj = { id: 12345678901234567890n };
// JSON.stringify(obj) // TypeError: Do something first...
const safe = JSON.stringify({ id: obj.id.toString() }); // 文字列化して送る
JavaScript8. すぐ試せるサンプル(ステップごとに説明)
// 1) 普通の Number の限界
const max = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(max + 1); // 9007199254740992
console.log(max + 2); // 9007199254740992 <- ここが問題
// 2) BigInt で正しく扱う
const big = 9007199254740991n;
console.log(big + 1n); // 9007199254740992n
console.log(big + 2n); // 9007199254740993n
// 3) BigInt と Number を混ぜるとエラー
// console.log(1n + 2); // TypeError
// 4) 明示変換で対応
console.log(1n + BigInt(2)); // 3n
console.log(Number(1n) + 2); // 3
// 5) 割り算は切り捨て
console.log(5n / 2n); // 2n
JavaScript- ステップごとのポイント:1→
Numberの限界を確認、2→nを付けて正しく計算、3→混ぜるとエラー、4→明示変換で解決、5→割り算は小数切り捨て。
まとめ
- 大きな整数を正確に扱いたいときは
BigInt(nを付ける)。 BigIntとNumberを混ぜない(混ぜると例外)。変換はBigInt()/Number()で明示的に。BigIntは小数を表現できない → 除算は切り捨て、Math.*は使えない。JSON.stringifyはそのままでは使えない → 文字列化などで対処。

