JavaScript | 長整数リテラルを数値に型変換

JavaScript JavaScript
スポンサーリンク

1. 概要

  • BigInt(長整数) は非常に大きな整数を扱うための型。末尾に n を付けるか BigInt(...) を使って作る。
  • Number(通常の数値) は倍精度浮動小数点で、整数でも小数でも扱えるが、整数部分は最大で 2^53-1Number.MAX_SAFE_INTEGER)まで安全に扱える。これを超えると丸め・精度の問題が起きる。
  • BigInt と Number を直接混ぜて算術演算(+, -, *, / 等)をするとエラーになる。(型が違うため)

2. エラーの例(初心者向け)

console.log(152n + 38); // ← ここで TypeError が出る(BigInt と Number を混ぜている)
JavaScript

このエラーは「BigInt と他の型(Number 等)を混ぜている。明示的な変換を使え」という意味です。

3. 型をそろえる(変換)の方法と注意点

A. BigInt → Number

使い方(シンプル):

let b = 1033n;
let n = Number(b);      // 1033 (Number 型)
let n2 = parseInt(b);   // 1033(parseInt は一度文字列にしてから解析する)
JavaScript

Number(...) が最もわかりやすく確実です。parseInt(...) も動きますが、parseInt は本来「文字列→整数」を想定した関数で、radix(基数)や文字列の扱いに注意が必要です(念のため Number() 推奨)。

重要な注意:BigInt を Number に変換するときは、変換後の値が Number.MAX_SAFE_INTEGER の範囲内か(負側も同様に Number.MIN_SAFE_INTEGER)を確認してください。それを超えると精度(整数の正確さ)が失われる可能性があります。

B. Number → BigInt

使い方:

let n = 842;
let b = BigInt(n); // 842n
JavaScript
  • BigInt(...) を使えば Number から BigInt に変換できます。
  • ただし BigInt() は整数しか受け付けません。BigInt(123.3) のように小数を渡すとエラー(RangeError)になります。整数であることを Number.isInteger などで確認してから変換しましょう。

4. 初心者が覚えておくべき実務ルール(チェックリスト)

  1. 「大きくなりうる整数(例:ID、台帳の残高など)」を扱うなら 最初から BigInt で揃える。途中で混ぜない。
  2. 小さな数(普通の計算)なら Number で OK。BigInt に変換すると小数は失う/エラーになるので注意。d
  3. BigInt → Number 変換は 必ず Number.MAX_SAFE_INTEGER の範囲を確認する(範囲外なら変換しないか別の扱いにする)。
  4. parseInt は動くが意図せぬ挙動になることがあるので、BigInt→Number の変換は Number() を優先

5. すぐ使える「安全ユーティリティ」例

以下は実務でよく役立つ小さな関数セット(そのままコピペして使えます)。

// BigInt を安全に Number に変換(範囲外なら例外)
function bigIntToNumberSafe(b) {
  if (typeof b !== 'bigint') throw new TypeError('bigIntToNumberSafe: 引数は bigint である必要があります');
  const MAX = BigInt(Number.MAX_SAFE_INTEGER);
  const MIN = BigInt(Number.MIN_SAFE_INTEGER);
  if (b > MAX || b < MIN) {
    throw new RangeError('変換すると精度が失われます: Number の安全範囲を超えています');
  }
  return Number(b);
}

// Number を安全に BigInt に変換(小数や NaN はエラー)
function numberToBigIntSafe(n) {
  if (typeof n !== 'number' || !Number.isFinite(n)) throw new TypeError('numberToBigIntSafe: 有限な number を渡してください');
  if (!Number.isInteger(n)) throw new RangeError('numberToBigIntSafe: 小数は BigInt に変換できません');
  return BigInt(n);
}

// BigInt と Number を受け取って「安全に」足し算する例
function addMixedSafe(a, b) {
  if (typeof a === typeof b) return a + b; // 両方 number か両方 bigint の場合そのまま
  // 片方が bigint, 片方が number の場合。number が整数かつ安全かをチェックして bigint にするパターン
  if (typeof a === 'bigint' && typeof b === 'number') {
    if (!Number.isInteger(b)) throw new RangeError('小数を BigInt と混ぜられません');
    return a + BigInt(b); // 戻りは bigint
  }
  if (typeof a === 'number' && typeof b === 'bigint') {
    if (!Number.isInteger(a)) throw new RangeError('小数を BigInt と混ぜられません');
    return BigInt(a) + b; // 戻りは bigint
  }
  throw new TypeError('対応していない型です');
}
JavaScript

これらの関数は「明示的に失敗させる(例外を投げる)」ことで、知らぬ間に精度が失われる事故を防ぎます。実運用では try...catch で扱ったり、戻り値をどちらの型に揃えるか(Number にするか BigInt にするか)を設計段階で決めておくと良いです。


まとめ

BigInt と Number は別物。混ぜるとエラーになるので、計算前に型をそろえる。

  • BigInt→Number は Number()(ただし MAX_SAFE_INTEGER を超えると精度を失う)。
  • Number→BigInt は BigInt()(整数のみ)。
タイトルとURLをコピーしました