JavaScript | 長整数リテラルの記述方法

JavaScript JavaScript
スポンサーリンク

1. BigInt(長整数)って何?

  • BigInt は「とても大きな整数」を正確に扱える新しい数の型(プリミティブ)です。整数リテラルの末尾に n を付けるか、BigInt() を使って作ります。

例:

const a = 123n;         // リテラル(末尾に n)
const b = BigInt("456"); // コンストラクタからも作れる
JavaScript

2. なぜ 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 で増えるはずなのに増えない
JavaScript

BigInt なら期待どおり:

const big = 9007199254740991n;
console.log(big + 1n); // 9007199254740992n
console.log(big + 2n); // 9007199254740993n
JavaScript

3. 書き方(リテラル・他の基数表記・区切り)

  • 10進リテラル: 123n
  • 16進/8進/2進 も同様に n を付ける:0xFFn, 0o77n, 0b1010ndeveloper.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 / 2n2n になります。
  • 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 === 0false。一方、抽象等価(==)だと 0n == 0true になります(内部で型変換を試みる)。

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() }); // 文字列化して送る
JavaScript

8. すぐ試せるサンプル(ステップごとに説明)

// 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→割り算は小数切り捨て。

まとめ

  • 大きな整数を正確に扱いたいときは BigIntn を付ける)。
  • BigIntNumber混ぜない(混ぜると例外)。変換は BigInt() / Number() で明示的に。
  • BigInt は小数を表現できない → 除算は切り捨て、Math.* は使えない。
  • JSON.stringify はそのままでは使えない → 文字列化などで対処。
タイトルとURLをコピーしました