【入門編】 BigInt型の特性と制限 – JavaScript実践ガイド

JavaScriptの世界へようこそ!
日々コードを書いていると、「あれ、思った通りの数字にならないぞ……?」と冷や汗をかいた経験、ありませんか?

特に、ECサイトの売上集計や、超高精度な数値(例えば、宇宙の距離……ではなく、データベースの巨大なIDなど)を扱うとき、JavaScriptの標準である `Number` 型のままでは、実は大きな「落とし穴」にハマってしまうんです。

今回は、そんな巨大な数字を安心して扱うための救世主、`BigInt`(ビッグインティジャー) 型についてお話しします。
「なんだか難しそうな名前だな……」なんて身構えなくて大丈夫ですよ。身近なたとえ話を交えながら、そっと優しくほどいていきますね。

—

1. なぜ BigInt が必要なの?(Number型の限界)

まずは、私たちが普段何気なく使っている `Number` 型の「限界」からお話ししましょう。

JavaScriptの `Number` 型は、実は「安全に正確さを保てる最大の数字」が決まっています。
それが、`Number.MAX_SAFE_INTEGER`(9,007,199,254,740,991:約900京) という数字です。

身近なたとえ:お会計の「レジの桁数」

想像してみてください。あなたが近所のスーパーでレジ打ちのアルバイトをしているとします。
使っているレジの画面が「9桁まで」しか表示できないタイプだったらどうでしょう?

そこへ、石油王みたいな大富豪がやってきて、「9,000,000,000,000,000,123円のお買い上げだよ!」 とカードを出してきました。
レジの画面は「9桁まで」なので、あふれた端っこ(下の桁)が勝手に切り捨てられたり、丸められたりして、正しい金額が打ち込めなくなってしまいますよね。

JavaScriptの `Number` 型もこれとまったく同じです。あまりに大きすぎる数字を扱うと、勝手に数字が丸められて誤差が出てしまうという恐ろしい仕様(倍精度浮動小数点数という仕組みのせいです)があります。

そこで登場したのが、この `BigInt` です。
こいつは、どれだけ桁数が長かろうが、ビクともせずに正確な整数を保持できる「無限に桁が増えるスーパー電卓」のようなものだと思ってください。

—

2. BigInt の基本的な使い方と特徴

`BigInt` を作るには、とってもカンタン。
整数の終わりの方に、アルファベットの `n` をくっつけるだけです。

// ふつうのNumber型(限界がある)
const normalNumber = 9007199254740991n; // 最後に ‘n’ をつけると BigInt になります!

// めちゃくちゃ大きな数字もこの通り!
const hugeNumber = 1234567890123456789012345678901234567890n;

console.log(hugeNumber);
// 出力: 1234567890123456789012345678901234567890n

「おっ、これならどんな大きな数字も怖くないな!」と思いましたよね。
はい、その通りです。ただし、この `BigInt` には、現場で開発しているときにつまずきやすい「3つの大きな制限(お約束)」があるんです。

ここからが本番ですよ。順番に見ていきましょう。

—

3. つまずきやすい3つの制限

① Number型との混在計算ができない!

ここが一番、初心者のころに「えっ!?」と声が出るところです。
`BigInt` はプライドが高い(?)のか、ふつうの `Number` 型とそのまま足し算や掛け算をしようとすると、怒られて(エラーを吐いて)しまいます。

const price = 100n; // BigInt型
const tax = 1.1; // Number型(小数)

// これをやると……?
// const total = price tax;
// 💥 TypeError: Cannot mix BigInt and other types

「なんで一緒に計算させてくれないの!」と涙目になりそうですが、理由はシンプル。「精度の違うものを混ぜると、どっちの基準に合わせていいか分からなくなるから」です。

【解決策:型を合わせる】
計算したいときは、あらかじめ `BigInt()` や `Number()` で型を統一してあげましょう。

const price = 100n;
const tax = 2n; // 整数なら BigInt にしちゃう

const total = price tax; // これならOK!
console.log(total); // 200n

② 小数点が扱えない(完全な整数専用)

`BigInt` という名前の通り、これは「整数(Integer)」のためのものです。
お小遣いの計算でよくある「10.5円」のような小数は扱えません。

// 小数を入れようとすると怒られます
// const half = 5n / 2n;
// あれ? 5 / 2 は 2.5 だよね……?

const result = 5n / 2n;
console.log(result); // 出力: 2n (小数点以下は容赦なく切り捨てられます!)

小数を扱いたい場合は、あらかじめ「100倍(銭単位)」にするなどして整数に直してから計算する、という実務での工夫(スケーリング)が必要になります。

③ JSONシリアライズ(JSON.stringify)でエラーになる!

Web開発では、サーバーとデータをやり取りするときに `JSON.stringify()` を使ってオブジェクトを文字列に変換することが日常茶飯事です。
しかし、ここに `BigInt` が混ざっていると、大事件が起きます。

const userData = {
id: 9007199254740991234n, // 巨大なID
name: “山田太郎”
};

// JSONに変換しようとすると……
// JSON.stringify(userData);
// 💥 TypeError: Do not know how to serialize a BigInt

「えっ、サーバーから送られてきた巨大なIDをJSONにできないの!?」
はい、JavaScriptの標準規格では、JSONは `BigInt` をどう扱っていいか分からないため、ここでストップしてしまいます。

【解決策:文字列に変換する】
実務では、JSONに含める前に `.toString()` を使って文字(文字列)に変換してしまうのが一番の近道です。

const userData = {
id: 9007199254740991234n.toString(), // 文字列にしちゃう!
name: “山田太郎”
};

const jsonString = JSON.stringify(userData);
console.log(jsonString);
// 出力: {“id”:”9007199254740991234″,”name”:”山田太郎”}
// これならバッチリですね!

—

4. まとめ:BigInt と上手に付き合うために

いかがだったでしょうか?
`BigInt` 型の特性と、ちょっとした制限についてイメージがつかめましたか?

  • 大きな数字(900京を超えるような値)を正確に扱いたいときは `BigInt`(最後に `n`)を使う!
  • ただし、`Number` 型と混ぜて計算はできないので注意。
  • 小数は扱えない(小数点以下は切り捨てられる)。
  • JSONにするときは `.toString()` で文字列にしてから渡す。

フロントエンドの開発現場では、普段のちょっとしたコードではあまり出番がないかもしれませんが、ブロックチェーン関連のアプリや、巨大なデータベースのIDを扱うシステムなど、「ここぞ」という場面で確実にあなたを助けてくれる頼もしい相棒です。

もしエラーに出くわしても、「あ、型が違うって怒られてるんだな」「JSONにする前に文字にしなきゃいけないんだな」と、今日のお話を思い出してもらえたらとても嬉しいです。

あなたのJavaScriptライフが、もっと楽しく、もっと快適になりますように。
それでは、また次の記事でお会いしましょう!

コメント

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