JavaScript | 基礎構文:データ型 – BigInt

JavaScript
スポンサーリンク

BigInt を一言でいうと

BigInt は、
「ふつうの Number では正確に扱えないレベルの“超でかい整数”を、安全に扱うためのデータ型」 です。

JavaScript の通常の数値(Number)は、
だいたい ±9,007,199,254,740,991(約 9 京)あたりまでしか “安全に” 扱えません(Number.MAX_SAFE_INTEGER 付近)。

それより大きな整数を正確に扱いたいときに登場するのが BigInt です。
「整数しか扱えない代わりに、桁数の制限をほぼ気にしなくてよくなる」イメージでいてください。


BigInt の基本:どう書くか、どう作るか

n を付ける書き方(リテラル)

一番よく使うのが、この書き方です。

const big = 123456789012345678901234567890n;
console.log(big);        // 123456789012345678901234567890n
console.log(typeof big); // "bigint"
JavaScript

末尾の n が「これは BigInt ですよ」という印です。

Number だと安全に扱えないような巨大な整数も、
n を付けて書けば BigInt としてそのまま扱えます。

const maxSafe = 9007199254740991;    // Number の安全な最大整数
const overSafe = 9007199254740993;   // すでに正確に表せない

console.log(maxSafe + 1 === maxSafe + 2); // true(おかしい)
JavaScript

これを BigInt で書くと:

const big1 = 9007199254740991n;
const big2 = 9007199254740992n;
const big3 = 9007199254740993n;

console.log(big1 + 1n === big2); // true(正しく扱える)
console.log(big2 + 1n === big3); // true
JavaScript

n を付けている限り、巨大でも整数として正確に扱えます。

BigInt 関数で作る書き方

リテラル以外にも、BigInt() で作ることができます。

const fromNumber = BigInt(123);         // 123n
const fromString = BigInt("1234567");   // 1234567n

console.log(fromNumber, fromString);
JavaScript

引数には整数(Number)か「整数の文字列」を渡します。

new BigInt() のように new は使いません。
 BigInt() は「関数」として呼び出します。


BigInt でできる基本的な計算

四則演算(+ − × ÷ %)

BigInt 同士なら、+ - * / % は基本的に Number と同じ感覚で使えます。

const a = 10000000000000000000n;
const b = 3n;

console.log(a + b);  // 10000000000000000003n
console.log(a - b);  // 9999999999999999997n
console.log(a * b);  // 30000000000000000000n
console.log(a / b);  // 3333333333333333333n(小数点以下は切り捨て)
console.log(a % b);  // 1n(余り)
JavaScript

割り算の結果は 必ず整数 になります。
小数点以下は切り捨て(floor)されると思っておいてください。

比較も、Number と同じ演算子でできます。

console.log(10n > 5n);   // true
console.log(10n === 10n); // true
JavaScript

Number と BigInt はそのまま混ぜて計算できない

これがかなり重要なポイントです。

const big = 10n;
const num = 1;

console.log(big + num); // TypeError: Cannot mix BigInt and other types
JavaScript

BigInt と Number は、暗黙に混ぜて計算することが禁止 されています。

一緒に計算したいなら、どちらかに揃える必要があります。

Number にそろえる:

const big = 10n;
const num = 1;

const result = Number(big) + num; // 11
JavaScript

BigInt にそろえる:

const big = 10n;
const num = 1;

const result = big + BigInt(num); // 11n
JavaScript

ただし、BigInt → Number に変換するときは
「Number が安全に扱える範囲を超えると桁が落ちる」 ことがあるので注意が必要です。


BigInt が役に立つ場面のイメージ

1: Number では安全でないくらい大きな整数

Number は内部的に「浮動小数点数(倍精度)」で表現されているため、
整数として安全なのは約 ±9,007,199,254,740,991 までです。

それを超える整数は、「表示上はそれっぽく見えても内部的には丸められている」可能性があります。

  • ID(注文番号やトランザクション ID)がとても大きい
  • 暗号やハッシュ、科学計算などで巨大な整数を扱う
  • 長期的な累積値(統計・ログカウントなど)が天文学的な数になる

こういう場面では、
「整数のまま桁を落とさずに扱える」 BigInt が必須になります。

2: ループ回数や桁数が Number の安全範囲を超えうるとき

たとえば、
巨大な配列のインデックスや「n 桁の階乗」「指数的に増える値」を扱うようなコードでは、
普通に Number で計算すると、いつの間にか桁が壊れていることがあります。

BigInt なら、
「とにかく全部整数として正確に持っておきたい」という要求に応えられます。


BigInt の制約・注意すべきポイント

1: Math オブジェクトとは一緒に使えない

Math.sqrt など、組み込みの Math 関数は BigInt を受け付けません。

const big = 16n;
console.log(Math.sqrt(big)); // TypeError
JavaScript

基本的に Math は Number 専用です。

もしどうしても使いたいなら、一度 Number に落とす必要がありますが、
巨大な値だと精度が失われるので、本当にそれでいいのかよく考える必要があります。

2: JSON にそのまま入れられない

JSON.stringify で BigInt を含むオブジェクトをそのまま変換しようとすると、エラーになります。

const data = { id: 12345678901234567890n, name: "Sample" };

JSON.stringify(data); // TypeError: Do not know how to serialize a BigInt
JavaScript

理由はシンプルで、
JSON というフォーマット自体に BigInt の型が存在しない からです。

回避策としては、

  • BigInt を事前に文字列に変換しておく
  • 送るときだけ id.toString() にして、受け取った側で BigInt() で戻す

といった工夫が必要になります。

3: 小数は扱えない(整数専用)

BigInt は 整数専用 です。

const x = 1.5n; // SyntaxError: Invalid or unexpected token
JavaScript

小数が必要なら、素直に Number を使うべきです。
「巨大・高精度な小数」が必要になったら、
BigInt ではなく、専用の多倍長小数ライブラリを使う世界に入ります。


実務的な「BigInt を使うかどうか」の判断軸

「Number で本当に足りないか?」をまず自分に聞く

多くの Web アプリや小さめのツールでは、
Number の安全範囲を超える整数を扱う機会は実は多くありません。

  • 通常のカウンター
  • 金額計算(日本円なら Number で足りることが多い)
  • ページ番号やユーザー数

こういったものは、まず Number で間に合います。

一方で、
次のような条件なら BigInt を検討する価値があります。

  • 外部 API・DB から「64bit 整数」や「それ以上の桁数の ID」が来る
  • 暗号・ブロックチェーン・巨大な素数などを扱う
  • Number.MAX_SAFE_INTEGER を超える可能性が実際にある

ここが重要です。
BigInt は「なんとなくかっこいいから使う」ものではなく、
“Number では正確に扱えない現実の要件があるとき” に初めて必要になる、
“精度のための武器” だと考えてください。


初心者向け BigInt の押さえどころ

最後に、最初の段階で本当に押さえてほしいポイントだけまとめます。

BigInt は「巨大な整数を正確に扱うためのデータ型」で、末尾に n を付けて書く(123n)。

通常の Number には「安全に扱える最大整数」があり、それを超えると桁が壊れるが、
BigInt なら理論上かなり大きな整数まで正確に扱える。

四則演算や比較は BigInt 同士なら Number とほぼ同じ感覚で書けるが、
Number と BigInt を混ぜた計算は TypeError になるので、どちらかの型に揃える必要がある。

BigInt は整数専用で、小数は扱えない。
また、Math 関数や JSON とはそのままでは相性が悪いので、必要に応じて Number や文字列に変換する工夫が必要。

ここが重要です。
「Number の限界を超える整数を、本当に誤差なしで扱う必要があるときだけ BigInt を使う」。
そういう“目的のはっきりした道具”として BigInt を頭の引き出しに入れておけば、
将来、大きな数と本気で戦うときに迷わず取り出せます。

小さな練習としては、

const maxSafe = Number.MAX_SAFE_INTEGER;      // 9007199254740991
console.log(maxSafe + 1 === maxSafe + 2);    // ?

const big = BigInt(maxSafe);
console.log(big + 1n === big + 2n);          // ?
JavaScript

を自分で実行してみて、

「Number では壊れる比較が、BigInt だと正しく動いている」

ことを体感してみてください。
それだけでも、「ああ、BigInt は“正確さ”のための存在なんだな」という感覚がかなりクリアになるはずです。

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