JavaScript/Number/isSafeInteger
Number.isSafeInteger()
は、ECMAScript における Number
オブジェクトのメソッドで、与えられた値が安全な整数(safe integer)であるかどうかを判定します。安全な整数とは、IEEE-754 倍精度浮動小数点形式で正確に表現できる整数のことで、(Number.MIN_SAFE_INTEGER
)から (Number.MAX_SAFE_INTEGER
)までの範囲にある整数を指します。
構文
[編集]Number.isSafeInteger(value)
パラメータ
[編集]value
- 安全な整数かどうかを判定する値。
戻り値
[編集]指定された値が安全な整数である場合は true
、そうでない場合は false
を返します。
説明
[編集]Number.isSafeInteger()
メソッドは、引数が以下の条件をすべて満たす場合に true
を返します:
- 引数が
Number
型である - 引数が整数である(小数部がない)
- 引数が
Number.MIN_SAFE_INTEGER
(-9007199254740991)以上、Number.MAX_SAFE_INTEGER
(9007199254740991)以下である
これらの条件のいずれかに該当しない場合、メソッドは false
を返します。
特性
[編集]Number.isSafeInteger()
には、以下のような特性があります:
- 静的メソッド: このメソッドは
Number
オブジェクトのプロトタイプではなく、Number
コンストラクタに直接関連付けられています。 - ECMAScript 6: このメソッドは ECMAScript 6(ES2015)で導入されました。
- 型変換なし: このメソッドは引数を数値に変換せず、引数が
Number
型でない場合は常にfalse
を返します。
例
[編集]基本的な使用法
[編集]以下のプログラムは、Number.isSafeInteger()
の基本的な使用法を示しています。
// 整数値の確認console.log(Number.isSafeInteger(3));// trueconsole.log(Number.isSafeInteger(Math.pow(2,53)-1));// trueconsole.log(Number.isSafeInteger(-Math.pow(2,53)+1));// trueconsole.log(Number.isSafeInteger(Math.pow(2,53)));// false// 浮動小数点数の確認console.log(Number.isSafeInteger(3.1));// falseconsole.log(Number.isSafeInteger(3.0));// true// 非数値の確認console.log(Number.isSafeInteger(NaN));// falseconsole.log(Number.isSafeInteger(Infinity));// falseconsole.log(Number.isSafeInteger('3'));// falseconsole.log(Number.isSafeInteger(null));// false
このプログラムでは、様々な値に対して Number.isSafeInteger()
メソッドを適用し、それらが安全な整数かどうかを確認しています。
Number.MAX_SAFE_INTEGER との関係
[編集]以下のプログラムは、Number.isSafeInteger()
と Number.MAX_SAFE_INTEGER
の関係を示しています。
// 安全な整数の上限console.log(Number.MAX_SAFE_INTEGER);// 9007199254740991console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER));// true// 安全な整数の範囲を超えるconsole.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1));// falseconsole.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER+2));// false// 安全でない整数の演算の問題console.log(Number.MAX_SAFE_INTEGER+1===Number.MAX_SAFE_INTEGER+2);// true (!) 異なる値なのに等しくなる
このプログラムでは、Number.MAX_SAFE_INTEGER
までの整数は安全ですが、それを超えると安全ではなくなることを示しています。安全でない整数値を使用すると、等値比較などで予期せぬ結果が生じる可能性があります。
独自の isSafeInteger 実装
[編集]Number.isSafeInteger()
メソッドが利用できない環境でも、同等の機能を実装できます。
// 独自の isSafeInteger 実装functionisSafeInteger(value){returnNumber.isInteger(value)&&Math.abs(value)<=Number.MAX_SAFE_INTEGER;}// または ES6 未対応環境での polyfillif(!Number.isSafeInteger){Number.isSafeInteger=function(value){returntypeofvalue==='number'&&Math.floor(value)===value&&Math.abs(value)<=9007199254740991;};}// テストconsole.log(isSafeInteger(42));// trueconsole.log(isSafeInteger(9007199254740992));// falseconsole.log(isSafeInteger(3.5));// false
このプログラムでは、Number.isSafeInteger()
メソッドの独自実装と、古いブラウザ向けの polyfill の例を示しています。
実用的な例
[編集]安全な数値計算の実装
[編集]以下のプログラムは、数値計算の結果が安全な整数の範囲内にあるかどうかを確認する例を示しています。
// 安全な整数演算を行う関数functionsafeAdd(a,b){if(!Number.isSafeInteger(a)||!Number.isSafeInteger(b)){thrownewError('入力値が安全な整数ではありません');}constresult=a+b;if(!Number.isSafeInteger(result)){thrownewError('計算結果が安全な整数の範囲を超えています');}returnresult;}// 使用例try{console.log(safeAdd(10,20));// 30console.log(safeAdd(Number.MAX_SAFE_INTEGER,1));// エラー}catch(e){console.error(e.message);// "計算結果が安全な整数の範囲を超えています"}
このプログラムでは、整数の加算を行う際に、入力値と計算結果が安全な整数の範囲内にあるかをチェックする関数の例を示しています。結果が安全な範囲を超える場合はエラーをスローします。
ID の安全性チェック
[編集]以下のプログラムは、データベースから取得した ID 値が安全な整数の範囲内にあるかどうかを確認する例を示しています。
// ID の安全性をチェックするユーティリティクラスclassIDValidator{constructor(){this.warningIssued=newSet();}// ID が安全かどうかをチェックvalidateID(id,source){constidNum=Number(id);if(!Number.isSafeInteger(idNum)){constkey=<code>${source}-${id}</code>;// 同じ ID について警告を繰り返さないif(!this.warningIssued.has(key)){console.warn(<code>警告:${source}から取得したID${id}は安全な整数ではありません。文字列として扱ってください。</code>);this.warningIssued.add(key);}returnfalse;}returntrue;}// 安全に ID を処理するprocessID(id,source){if(this.validateID(id,source)){// 数値として処理return{id:Number(id),type:'number'};}else{// 文字列として処理return{id:String(id),type:'string'};}}}// 使用例constvalidator=newIDValidator();// 安全な ID の処理console.log(validator.processID(123456,'users'));// { id: 123456, type: 'number' }// 安全でない ID の処理constlargeID='9007199254740993';// MAX_SAFE_INTEGER + 2console.log(validator.processID(largeID,'products'));// { id: "9007199254740993", type: 'string' }
このプログラムでは、外部ソースから取得した ID 値が安全な整数の範囲内にあるかをチェックし、安全でない場合は文字列として処理するユーティリティクラスの例を示しています。これにより、大きな ID 値を扱う際の精度の問題を回避することができます。
BigInt を使った安全な整数の扱い
[編集]ECMAScript 2020(ES11)で導入された BigInt
型を使用すると、Number.MAX_SAFE_INTEGER
を超える整数値も安全に扱うことができます。
// Number の制限を超える値constunsafe=Number.MAX_SAFE_INTEGER+1;console.log(unsafe);// 9007199254740992console.log(Number.isSafeInteger(unsafe));// false// BigInt を使用した安全な大きな整数constsafeBigInt=BigInt(Number.MAX_SAFE_INTEGER)+1n;console.log(safeBigInt);// 9007199254740992nconsole.log(safeBigInt===BigInt(Number.MAX_SAFE_INTEGER)+2n);// false (正しい比較)// BigInt と Number の相互変換時の注意点functionconvertToBigIntIfNeeded(value){if(typeofvalue==='number'){if(!Number.isSafeInteger(value)){console.warn(`警告: ${value} は安全な整数ではありません。BigInt に変換します。`);returnBigInt(Math.floor(value));}returnBigInt(value);}returnvalue;}console.log(convertToBigIntIfNeeded(Number.MAX_SAFE_INTEGER));// 9007199254740991nconsole.log(convertToBigIntIfNeeded(Number.MAX_SAFE_INTEGER+1));// 警告を出力して 9007199254740992n
このプログラムでは、Number.isSafeInteger()
を使って安全でない整数を検出し、必要に応じて BigInt
型に変換する例を示しています。BigInt
を使用すると、任意の精度で整数を扱うことができます。
ブラウザの互換性
[編集]Number.isSafeInteger()
メソッドは、ECMAScript 6(ES2015)で導入されたため、以下のようなモダンブラウザで利用できます:
- Chrome 34 以降
- Firefox 32 以降
- Safari 10 以降
- Edge 12 以降
- Internet Explorer: サポートなし
古いブラウザでこのメソッドを使用する場合は、前述の polyfill を使用することができます。
関連項目
[編集]Number.MAX_SAFE_INTEGER
: JavaScript で安全に表現できる最大の整数値を表すプロパティNumber.MIN_SAFE_INTEGER
: JavaScript で安全に表現できる最小の整数値を表すプロパティNumber.isInteger()
: 引数が整数かどうかを判定するメソッドBigInt
: 任意の精度の整数を表すプリミティブ値