現場で戦っていると、一度は必ずぶち当たる「壁」がある。それが `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が君の計算結果を壊さないように守ってくれているんだよ」と伝えてあげてほしい。そうすれば、ただの「面倒な仕様」が「頼れるガードレール」に見えてくるはずだ。

コメント