JavaScript/Number/MIN SAFE INTEGER

カテゴリ:Book:JavaScript#Number/MIN%20SAFE%20INTEGER%20

Number.MIN_SAFE_INTEGER は、ECMAScript における Number オブジェクトのプロパティで、JavaScript で正確に表現および比較できる最小の整数値を表します。この値は で、-9007199254740991(-9,007,199,254,740,991)に等しくなります[1]

構文

Number.MIN_SAFE_INTEGER

Number.MIN_SAFE_INTEGER の値は -9007199254740991(-9,007,199,254,740,991)で、に等しくなります。

特性

Number.MIN_SAFE_INTEGER には、以下のような特性があります:

  • 読み取り専用: このプロパティは変更できません。プロパティ属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } に設定されています。
  • データプロパティ: Number.MIN_SAFE_INTEGER は値プロパティであり、メソッドではありません。
  • 安全な整数: この値までの整数は JavaScript において正確に表現および比較できます。これを下回る整数値は精度が失われる可能性があります。
  • ECMAScript 6: このプロパティは ECMAScript 6(ES2015)で導入されました。

基本的な使用法

以下のプログラムは、Number.MIN_SAFE_INTEGER の基本的な使用法を示しています。

// Number.MIN_SAFE_INTEGER の値を表示
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991

// 数学的に同等な表現
console.log(-(Math.pow(2, 53) - 1)); // -9007199254740991

// 型の確認
console.log(typeof Number.MIN_SAFE_INTEGER); // number

このプログラムでは、Number.MIN_SAFE_INTEGER の値とその型を示しています。また、この値が に等しいことも確認できます。

安全な整数の範囲

以下のプログラムは、安全な整数の範囲を超えた場合の精度の問題を示しています。

// 安全な整数の範囲内
const safeInteger = Number.MIN_SAFE_INTEGER;
console.log(safeInteger); // -9007199254740991
console.log(safeInteger + 0 === safeInteger); // true

// 安全な整数の範囲を超える
const unsafeInteger = Number.MIN_SAFE_INTEGER - 1;
const nextUnsafeInteger = Number.MIN_SAFE_INTEGER - 2;

console.log(unsafeInteger); // -9007199254740992
console.log(nextUnsafeInteger); // -9007199254740992
console.log(unsafeInteger === nextUnsafeInteger); // true (!) 異なる値なのに等しくなる

// 精度の問題
console.log(Number.MIN_SAFE_INTEGER - 3); // -9007199254740994
console.log(Number.MIN_SAFE_INTEGER - 4); // -9007199254740996
console.log(Number.MIN_SAFE_INTEGER - 5); // -9007199254740996 (!) 期待値は -9007199254740996 だが、精度の問題で同じになる

このプログラムでは、Number.MIN_SAFE_INTEGER を下回る整数値を扱う際に発生する精度の問題を示しています。具体的には、異なる値が等しくなったり、予期せぬ結果になったりする例を示しています。

Number.isSafeInteger の使用

以下のプログラムは、Number.isSafeInteger() メソッドを使用して、整数が安全な範囲内にあるかどうかを確認する例を示しています。

// 安全な整数かどうかの確認
console.log(Number.isSafeInteger(-42)); // true
console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER)); // true
console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1)); // false
console.log(Number.isSafeInteger(-Math.pow(2, 53))); // false

// 浮動小数点数や大きな負の値の場合
console.log(Number.isSafeInteger(-3.14)); // false
console.log(Number.isSafeInteger(-Number.MAX_VALUE)); // false
console.log(Number.isSafeInteger(-Infinity)); // false

このプログラムでは、Number.isSafeInteger() メソッドを使用して、様々な値が安全な整数かどうかを確認する例を示しています。Number.MIN_SAFE_INTEGER 以上の整数は安全ですが、それを下回る値や浮動小数点数は安全でないことがわかります。

実用的な例

負の整数の安全性チェック

以下のプログラムは、負の整数計算の結果が安全な範囲内にあるかどうかをチェックする例を示しています。

// 安全な負の整数計算を行う関数
function safeNegativeIntegerOperation(a, b, operation) {
  // 入力値が安全な整数かをチェック
  if (!Number.isSafeInteger(a) || !Number.isSafeInteger(b)) {
    throw new Error('入力値が安全な整数ではありません');
  }
  
  // 計算を実行
  let result;
  switch (operation) {
    case 'add':
      result = a + b;
      break;
    case 'subtract':
      result = a - b;
      break;
    case 'multiply':
      result = a * b;
      break;
    case 'divide':
      result = Math.floor(a / b); // 整数除算
      break;
    default:
      throw new Error('未対応の操作です');
  }
  
  // 結果が安全な整数かをチェック
  if (!Number.isSafeInteger(result)) {
    throw new Error('計算結果が安全な整数の範囲を超えています');
  }
  
  return result;
}

// 安全な計算
try {
  console.log(safeNegativeIntegerOperation(-1000000, -2000000, 'add')); // -3000000
  console.log(safeNegativeIntegerOperation(-1000, 2000, 'multiply')); // -2000000
} catch (e) {
  console.error(e.message);
}

// 安全でない計算
try {
  console.log(safeNegativeIntegerOperation(Number.MIN_SAFE_INTEGER, -1, 'subtract')); // エラー
} catch (e) {
  console.error(e.message); // "計算結果が安全な整数の範囲を超えています"
}

このプログラムでは、負の整数計算を行う前に入力値が安全な整数かをチェックし、計算結果も安全な整数の範囲内にあるかをチェックする関数の例を示しています。結果が安全な範囲を超える場合はエラーをスローします。

安全な整数範囲の検証

以下のプログラムは、入力された値が安全な整数の範囲内にあるかどうかを検証する例を示しています。

// 値が安全な整数範囲内にあるかどうかを検証する関数
function validateSafeInteger(value, fieldName = 'Value') {
  if (typeof value !== 'number') {
    return `${fieldName} は数値である必要があります`;
  }
  
  if (!Number.isInteger(value)) {
    return `${fieldName} は整数である必要があります`;
  }
  
  if (value < Number.MIN_SAFE_INTEGER || value > Number.MAX_SAFE_INTEGER) {
    return `${fieldName} は安全な整数の範囲内 (${Number.MIN_SAFE_INTEGER} から ${Number.MAX_SAFE_INTEGER}) である必要があります`;
  }
  
  return null; // 検証に成功
}

// フォームデータを検証する例
function validateFormData(data) {
  const errors = {};
  
  // ID フィールドの検証
  const idError = validateSafeInteger(data.id, 'ID');
  if (idError) errors.id = idError;
  
  // 数量フィールドの検証
  const quantityError = validateSafeInteger(data.quantity, '数量');
  if (quantityError) errors.quantity = quantityError;
  
  // スコアフィールドの検証
  const scoreError = validateSafeInteger(data.score, 'スコア');
  if (scoreError) errors.score = scoreError;
  
  return {
    isValid: Object.keys(errors).length === 0,
    errors
  };
}

// テストデータ
const validData = {
  id: 12345,
  quantity: -5000,
  score: 9000000000000000 // 安全な範囲内の大きな値
};

const invalidData = {
  id: -9007199254740992, // MIN_SAFE_INTEGER より小さい
  quantity: 3.5, // 整数ではない
  score: 'high' // 数値ではない
};

console.log('Valid data validation:', validateFormData(validData));
// { isValid: true, errors: {} }

console.log('Invalid data validation:', validateFormData(invalidData));
// { isValid: false, errors: { id: 'ID は安全な整数の範囲内 (...) である必要があります', ... } }

このプログラムでは、入力データが安全な整数の範囲内にあるかどうかを検証する関数の例を示しています。フォームデータなどの検証に適用できます。

BigInt との関係

ECMAScript 2020(ES11)で導入された BigInt 型は、Number.MIN_SAFE_INTEGER を下回る安全な整数値を扱うための解決策です。

// Number の制限
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2); // true (精度の問題)

// BigInt を使用する例
const minSafeInteger = BigInt(Number.MIN_SAFE_INTEGER);
console.log(minSafeInteger); // -9007199254740991n

// BigInt での計算(精度の問題なし)
console.log(minSafeInteger - 1n); // -9007199254740992n
console.log(minSafeInteger - 2n); // -9007199254740993n
console.log(minSafeInteger - 1n === minSafeInteger - 2n); // false (正しい比較)

// 非常に小さな値でも正確に計算可能
const bigNegativeValue = minSafeInteger * minSafeInteger;
console.log(bigNegativeValue); // 81129638414606663681390495662081n (正の値になることに注意)

このプログラムでは、Number.MIN_SAFE_INTEGER の制限と、BigInt を使用してこの制限を克服する例を示しています。BigInt を使用すると、任意の精度で整数を扱うことができます。

安全な整数の範囲

JavaScript における安全な整数の範囲は、Number.MIN_SAFE_INTEGER から Number.MAX_SAFE_INTEGER までです。

// 安全な整数の範囲
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

// 安全な整数の範囲をチェックする関数
function isInSafeIntegerRange(value) {
  return value >= Number.MIN_SAFE_INTEGER && value <= Number.MAX_SAFE_INTEGER;
}

console.log(isInSafeIntegerRange(42)); // true
console.log(isInSafeIntegerRange(-42)); // true
console.log(isInSafeIntegerRange(Number.MAX_SAFE_INTEGER)); // true
console.log(isInSafeIntegerRange(Number.MIN_SAFE_INTEGER)); // true
console.log(isInSafeIntegerRange(Number.MAX_SAFE_INTEGER + 1)); // false
console.log(isInSafeIntegerRange(Number.MIN_SAFE_INTEGER - 1)); // false

このプログラムでは、JavaScript における安全な整数の範囲と、値がその範囲内にあるかどうかをチェックする関数の例を示しています。

その他の Number オブジェクトの特殊値

ECMAScript は、Number オブジェクトに他の特殊な値も定義しています:

脚註

  1. Number.MIN_SAFE_INTEGER よりも小さな整数は JavaScript では正確に表現できず、丸め誤差が発生する可能性があります。

外部リンク

カテゴリ:Book:JavaScript#Number/MIN%20SAFE%20INTEGER%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension