【実務・中級編】 BigIntとNumber型の相互運用性の制限 – JavaScript実践ガイド

現場で戦っていると、一度は必ずぶち当たる「壁」がある。それが `BigInt` と `Number` の混在だ。

「え、JSって何でもよしなに計算してくれるんじゃないの?」という甘い期待を、JavaScriptのエンジンは容赦なく打ち砕いてくる。今日は、なぜJavaScriptがこの二つを頑なに混ぜようとしないのか、そして実務でどう立ち回るべきか、裏側の事情とセットで紐解いていこう。

—

なぜ「混ぜるな危険」なのか?

結論から言えば、「精度が壊れるから」に尽きる。

`Number` 型(IEEE 754倍精度浮動小数点数)は、非常に大きな数や小さな数を扱えるけれど、本質的には「近似値」を扱うための型だ。対して `BigInt` は、どんなに巨大な整数であっても、その値を正確に保持するために生まれた。

この二つを暗黙的に混ぜて計算させると、どっちの型に合わせればいいのかエンジンは迷子になる。もし `BigInt` を `Number` に合わせれば、巨大な整数が途端に「丸められて」しまい、精度の意味をなさなくなる。だからこそ、JSの仕様は「暗黙の型変換は許さん」と門前払いを食らわせるわけだ。

現場で遭遇する「あのエラー」

開発中にコンソールでこれを見ると、一瞬手が止まるはずだ。

const bigIntVal = 100n;
const numberVal = 5;

// この演算は TypeError を吐き出す
// “Cannot mix BigInt and other types, use explicit conversions”
console.log(bigIntVal + numberVal);

ブラウザのV8エンジンなどの内部処理において、`BigInt` と `Number` を混ぜた算術演算を実行しようとすると、例外がスローされるよう厳格に定義されている。これはバグを未然に防ぐための強力な「ガードレール」なんだ。

—

どう乗り越えるか:明示的キャストの流儀

実務では、どちらに寄せるかを「意図的に」コードで示す必要がある。ここでは二つのパターンを紹介する。

1. BigInt に統合する(精度を維持したい場合)

金額計算や、DBの大きなIDを扱うときはこちらだ。

const bigIntVal = 100n;
const numberVal = 5;

// BigIntに合わせる。ただし、numberValに小数が入っているとエラーになるので注意
const result = bigIntVal + BigInt(numberVal);

console.log(result); // 105n

2. Number に統合する(統計や表示で使う場合)

精度よりも扱いやすさを優先する場合だ。ただし、大きな数だと下位の桁が欠落するリスクを常に意識すること。

const bigIntVal = 9007199254740993n; // Numberの安全な上限を超えている

// Numberへ変換。大きな数は丸められる(精度が落ちる)
const result = Number(bigIntVal) + 10;

console.log(result); // 9007199254741004 (正確な値ではない可能性がある)

—

実務で役立つ「鉄板の安全ガード」

チーム開発をしていると、APIレスポンスのIDが `string` で来たり `number` で来たり、時には `BigInt` が紛れ込んでいたりしてカオスになることがある。そんな時のための、実用的なユーティリティ関数を置いておく。

/

  • どんな型が来ても安全にBigIntとして加算するヘルパー
  • 外部からの不確定なデータソースを扱う際によく使う

/
const safeAdd = (a, b) => {
try {
// どちらもBigIntに寄せて計算する
return BigInt(a) + BigInt(b);
} catch (e) {
console.error(“計算不能な型が含まれています:”, e);
return null;
}
};

console.log(safeAdd(100n, “50”)); // 150n
console.log(safeAdd(100, 50)); // 150n

最後に:シニアからのアドバイス

`BigInt` が登場してから、JavaScriptは「整数」を正しく扱うための武器を手に入れた。しかし、それは同時に「型変換を意識しろ」というエンジニアへのメッセージでもある。

実務で「なぜか計算が合わない」「謎のエラーが出る」という時は、一度 `typeof` を確認してほしい。「暗黙の型変換に頼らない」という姿勢は、コードの堅牢性を高めるための最も安上がりで、最も効果的な手法だ。

もし後輩がこのエラーで詰まっていたら、まずは「これはJavaScriptが君の計算結果を壊さないように守ってくれているんだよ」と伝えてあげてほしい。そうすれば、ただの「面倒な仕様」が「頼れるガードレール」に見えてくるはずだ。

コメント

タイトルとURLをコピーしました