JavaScript | 長整数リテラルの記述方法

JavaScript JavaScript
スポンサーリンク

BigInt と Number の安全変換ユーティリティ集

目的

  • NumberBigInt が混ざっても 自動で安全に変換 してくれる
  • 大きすぎる整数を検知して BigInt に切り替える
  • 演算・比較・型変換 を一括で扱えるようにする

1. 自動型判定・変換ルール

まず基本ルール:

入力の型変換対象方針
両方とも NumberNumber 同士のまま
両方とも BigIntBigInt 同士のまま
混在(Number + BigInt)→ 両方 BigInt に統一(精度優先)
どちらかが小数→ 両方 Number に統一(小数を扱うため)

2. 実装コード:safeMath.js

// -----------------------------
// BigInt / Number 安全演算ユーティリティ
// -----------------------------

// 安全変換関数
function toSafeType(a, b) {
  const isBigIntA = typeof a === "bigint";
  const isBigIntB = typeof b === "bigint";

  // 両方 BigInt
  if (isBigIntA && isBigIntB) return [a, b];

  // どちらか小数なら Number 優先
  if (!Number.isInteger(a) || !Number.isInteger(b)) {
    return [Number(a), Number(b)];
  }

  // どちらか BigInt → 両方 BigInt に統一
  if (isBigIntA || isBigIntB) {
    return [BigInt(a), BigInt(b)];
  }

  // それ以外(両方 Number)
  return [a, b];
}

// 安全演算ラッパー
const SafeMath = {
  add(a, b) {
    const [x, y] = toSafeType(a, b);
    return typeof x === "bigint" ? x + y : x + y;
  },
  sub(a, b) {
    const [x, y] = toSafeType(a, b);
    return typeof x === "bigint" ? x - y : x - y;
  },
  mul(a, b) {
    const [x, y] = toSafeType(a, b);
    return typeof x === "bigint" ? x * y : x * y;
  },
  div(a, b) {
    const [x, y] = toSafeType(a, b);
    if (typeof x === "bigint") {
      if (y === 0n) throw new Error("Division by zero");
      return x / y; // BigIntは切り捨て除算
    } else {
      if (y === 0) throw new Error("Division by zero");
      return x / y;
    }
  },
  eq(a, b) {
    const [x, y] = toSafeType(a, b);
    return x === y;
  },
  lt(a, b) {
    const [x, y] = toSafeType(a, b);
    return x < y;
  },
  gt(a, b) {
    const [x, y] = toSafeType(a, b);
    return x > y;
  },
};
JavaScript

3. 使用例

console.log(SafeMath.add(10, 20n));     // 30n (自動で BigInt に変換)
console.log(SafeMath.sub(5n, 2));       // 3n
console.log(SafeMath.mul(10, 2));       // 20
console.log(SafeMath.div(5n, 2));       // 2n(BigInt除算 → 小数切り捨て)
console.log(SafeMath.div(5, 2));        // 2.5(Number除算)
console.log(SafeMath.eq(10n, 10));      // true(自動変換で一致)
console.log(SafeMath.lt(9n, 10));       // true
JavaScript

4. 安全設計ポイント

チェック項目対策
BigInt と Number 混在自動で BigInt 統一
小数が含まれるNumber 優先
0除算エラーをスロー
比較演算型を統一して安全比較
丸め誤差BigInt使用時は完全排除

5. 拡張アイデア(応用版)

  • autoConvertLimit 設定
    Number が安全範囲(2^53 - 1)を超えたら自動で BigInt に変換
  • SmartJSON ヘルパー
    → JSON.stringify で BigInt を文字列に変換/復元できる
  • SafeMath.autoMode("precision" | "speed")
    → 処理速度優先 or 精度優先モードを切り替え

6. まとめ(覚えやすく)

Rule説明
n が付いたら BigInt大きな整数を安全に扱う
混ぜると危険 → 自動変換SafeMath が面倒を解決
小数があれば Number 優先BigInt は整数だけ
型を意識して安全に使う暗黙変換より明示変換
タイトルとURLをコピーしました