====== JavaScript Numberオブジェクト ======
--- //[[http://www.y2sunlight.com/water|y2sunlight]] 2021-07-26//
[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number|Numberオブジェクト]]は数値型( number )を扱うためのラッパーオブジェクトです。
===== NaNとInfinity =====
JavaScriptでは、以下の特殊な数値を Numberオブジェクトのプロパティが保持しています。
* NaN ・・・ ゼロをゼロで割った場合などの未定義な演算結果を表す値
* Infinity ・・・ 浮動小数点数が表現可能な最大値を超えた場合の値
ECMA標準では、これらの特殊な値はグローバル変数 ([[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/NaN|NaN]] と [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Infinity|Infinity]]) としても定義されていますが、Numberオブジェクトの[[#静的プロパティ|静的プロパティ]]でも同じ値が保持されています。
NaN に対する演算は、特殊な振舞いをします。NaN を含むどんな演算もその結果は NaN になります。例えば、''NaN + 1'' は NaN になり、''NaN == 1'' は false になります。最も混乱させるのは、''NaN == NaN'' の結果が false になるということです。従って、NaN には比較演算子を適用することが出来ません。この理由から、NaN を判定する特別な関数 isNaN() が提供されています。
\\
===== Number()関数 =====
Numberオブジェクトはコンストラクタによって以下の様に生成されます。
let number = new Number(1);
console.log(typeof(number)); // object
このコンストラクタは Numberオブジェクトを返しますが、あまり使用されることはなく、[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number|Number()]] 関数の方が良く使用されます。
let number = Number(1);
console.log(typeof(number)); // number
両者の違いは、Numberオブジェクトを返すか、基本データ型( number )を返すかの違いであり、厳密には異なりますが、実務上それは意識する必要がほとんどありません。
\\
===== 静的プロパティ =====
詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#static_properties|MDN]]をご覧下さい。
^メンバー^概要^
|Number.EPSILON|計算機 ε(イプシロン)と呼ばれる1より大きい最小の数と1との差|
|Number.MIN_VALUE|正の数の最小値|
|Number.MAX_VALUE|正の数の最大値|
|Number.MIN_SAFE_INTEGER|整数の最小値 -(253 - 1)|
|Number.MAX_SAFE_INTEGER|整数の最大値 253 - 1|
|Number.NaN|非数(Not a Number)の値|
|Number.NEGATIVE_INFINITY|負の最大値を表す値(オーバーフロー時に返されます)|
|Number.POSITIVE_INFINITY|正の最大値を表す値(オーバーフロー時に返されます)|
\\
===== 静的メソッド =====
以下に主な Numberオブジェクトの静的メソッドの使用例を示します。詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#static_methods|MDN]]をご覧下さい。
==== isNaN() ====
Number.isNaN(value)
引数が NaN(Not a Number)且つ number型の場合、true を返します。NaN については[[#NaNとInfinity|前の項]]を参照して下さい。
var x = 123;
var ret = Number.isNaN(x);
console.log(ret); // false
var x = 1.23;
var ret = Number.isNaN(x);
console.log(ret); // false
var x = '123';
var ret = Number.isNaN(x);
console.log(ret); // false
var x = 'abc';
var ret = Number.isNaN(x);
console.log(ret); // false (NaN 且つ 非number型)
var x = 1 / 0;
var ret = Number.isNaN(x);
console.log(ret); // false (Infinity)
var x = 0 / 0;
var ret = Number.isNaN(x);
console.log(ret); // true (NaN 且つ number型)
Number.isNaN() 以外にグローバル関数の [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isNaN|isNaN()]] もあります。この関数は引数が NaN のみを判定し、引数のデータ型には依存しません。
console.log(isNaN(123)); // false
console.log(isNaN(1.23)); // false
console.log(isNaN('123')); // false
console.log(isNaN('abc')); // true (NaN 且つ 非number型)
console.log(isNaN(1/0)); // false (Infinity)
console.log(isNaN(0/0)); // true (NaN 且つ number型)
\\
==== isFinite() ====
Number.isFinite(value)
引数が有限数( finity )の場合、true を返します。有限数でない値(infinity)については[[#NaNとInfinity|前の項]]を参照して下さい。
var x = 123;
var ret = Number.isFinite(x);
console.log(ret); // true
var x = 1.23;
var ret = Number.isFinite(x);
console.log(ret); // true
var x = '123';
var ret = Number.isFinite(x);
console.log(ret); // false (非number型)
var x = 'abc';
var ret = Number.isFinite(x);
console.log(ret); // false (非number型)
var x = 1 / 0;
var ret = Number.isFinite(x);
console.log(ret); // false (Infinity)
var x = 0 / 0;
var ret = Number.isFinite(x);
console.log(ret); // false (NaN)
Number.isFinite() 以外にグローバル関数の [[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/isFinite|isFinite()]] もあります。
\\
==== isInteger() ====
Number.isInteger(value)
引数が整数の場合、true を返します。
var x = 123;
var ret = Number.isInteger(x);
console.log(ret); // true
var x = 1.23;
var ret = Number.isInteger(x);
console.log(ret); // false
var x = '123';
var ret = Number.isInteger(x);
console.log(ret); // false (非number型)
var x = 'abc';
var ret = Number.isInteger(x);
console.log(ret); // false (非number型)
var x = 1 / 0;
var ret = Number.isInteger(x);
console.log(ret); // false (Infinity)
var x = 0 / 0;
var ret = Number.isInteger(x);
console.log(ret); // false (NaN)
\\
==== parseFloat() ====
Number.parseFloat(string)
引数の文字列を浮動小数点数( float )に変換します。グローバル関数の parseFloat と同じです。
var x = 2;
var ret = Number.parseFloat(x) * 2.0 * 3.14;
console.log(ret); // 12.56
var x = 2;
var ret = parseFloat(x) * 2.0 * 3.14;
console.log(ret); // 12.56
\\
==== parseInt() ====
Number.parseInt(string,[ radix])
引数の文字列を指定された基数の整数に変換します。
var x = 10;
var ret = Number.parseInt(x, 2); // 2進数を10進数へ変換
console.log(ret); // 2
var x = 10;
var ret = Number.parseInt(x, 8); // 8進数を10進数へ変換
console.log(ret); // 8
var x = 10;
var ret = Number.parseInt(x, 16); // 16進数を10進数へ変換
console.log(ret); // 16
var x = '123';
var ret = Number.parseInt(x, 10); // 10進数の文字列をを整数に変換
console.log(ret); // 123
var x = 12.3;
var ret = Number.parseInt(x, 10); // 浮動小数点数から整数に変換
console.log(ret); // 12
var x = 'abc';
var ret = Number.parseInt(x, 10); // 文字は整数に変換できない
console.log(ret); // NaN
上の例はグローバル関数 parseInt を使用した場合でも同様になります。
var x = 10;
var ret = parseInt(x, 2);
console.log(ret); // 2
\\
===== インスタンスメソッド =====
以下に主な Numberオブジェクトのインスタンスメソッドの使用例を示します。詳しくは[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#instance_methods|MDN]]をご覧下さい。
==== toString() ====
numObj.toString([radix])
Numberオブジェクトを文字列に変換します。
var x = new Number(123);
var ret = x.toString();
console.log(ret); // 123
var x = new Number(1.23);
var ret = x.toString();
console.log(ret); // 1.23
var x = new Number(1 / 0);
var ret = x.toString();
console.log(ret); // Infinity
var x = new Number(0 / 0);
var ret = x.toString();
console.log(ret); // NaN
\\
==== toLocaleString() ====
numObj.toLocaleString([locales [, options]])
Numberオブジェクトをロケールに応じた形式に変換します。JavaScriptで数値をカンマ編集したい場合は、このメソッドが利用出来ます。
var x = new Number(1234.56);
var ret = x.toLocaleString();
console.log(ret); // 1,234.56
\\
==== toFixed() ====
numObj.toFixed([digits])
Numberオブジェクトを指定された固定小数点表記に変換します。
var x = new Number(1234.56);
var ret = x.toFixed(3);
console.log(ret); // 1234.560
\\
==== toPrecision() ====
numObj.toPrecision([precision])
Numberオブジェクトを指定された精度の文字列に変換します。
var x = new Number(1234.56);
var ret = x.toPrecision(5);
console.log(ret); // 1234.6
\\
==== toExponential() ====
numObj.toExponential([fractionDigits])
Numberオブジェクトを指定された指定表記に変換します。
var x = new Number(1234.56);
var ret = x.toExponential(2);
console.log(ret); // 1.23e+3
\\
==== valueOf() ====
numObj.valueOf()
Numberオブジェクトのプリミティブ値を返します。
var x = new Number(1234.56);
var ret = x.valueOf();
console.log(ret); // 1234.56
\\
===== 数値のバリデーション方法 =====
入力された値または計算結果が数値であるか否かを判定(バリデーション)する場合は isNaN()またはisFinite()を使用した様々な方法がありますが、当サイトでは以下のisFinite()を使った方法で数値のバリデーションを行うことを推奨します。
var x = 123;
var ret = Number.isFinite(Number(x));
console.log(ret); // true
var x = 1.23;
var ret = Number.isFinite(Number(x));
console.log(ret); // true
var x = '123';
var ret = Number.isFinite(Number(x));
console.log(ret); // true
var x = 'abc';
var ret = Number.isFinite(Number(x));
console.log(ret); // false (NaN)
var x = 1 / 0;
var ret = Number.isFinite(Number(x));
console.log(ret); // false (Infinity)
var x = 0 / 0;
var ret = Number.isFinite(Number(x));
console.log(ret); // false (NaN)
isNaN()を使った方法では ''1 / 0'' の判定ができません(isNaN()はtrueを返す)。入力時のバリデーションに対してはいずれの方法を使用してもバリデーションできると思います。
\\