JavaScript

レシピ

数値

数値(Number)について

JavaScriptのデータ型の1つであるNumberについて、基本的な値や計算方法について解説します。

この記事のポイント

  • 整数と浮動小数点数はどちらも同じ数値(Number)の型になる
  • 数値はプリミティブ値とNumberオブジェクトのインスタンスの2種類ある
  • 文字列の数字は数値(Number)の型に変換することができる

目次

JavaScriptの数値

JavaScriptでは整数、少数点数のいずれも「Number」という型で扱います。

以下の変数number1number6に入れる値はいずれもNumberのプリミティブ値になります。
変数number7のみ明示的にNumberオブジェクトのインスタンスを作成しています。

コード例

var number1 = 100;
var number2 = 0;
var number3 = -8591;
var number4 = 10.052398122;
var number5 = NaN;
var number6 = Infinity;
var number7 = new Number(1000);

// 値を出力
console.log(number1); // 100
console.log(number2); // 0
console.log(number3); // -8591
console.log(number4); // 10.052398122
console.log(number5); // NaN
console.log(number6); // Infinity
console.log(number7.valueOf()); // 1000

// 型を出力
console.log(typeof number1); // number
console.log(typeof number2); // number
console.log(typeof number3); // number
console.log(typeof number4); // number
console.log(typeof number5); // number
console.log(typeof number6); // number
console.log(typeof number7); // object

より正確には、Numberという型はNumberオブジェクトになりますが、数値はプリミティブ値のためオブジェクトのインスタンスを作成しなくても値をそのまま扱うことができます。
変数number1number6は全てプリミティブ値の数値です。

変数number7のみ、new演算子でオブジェクトのインスタンスを作成しています。
この場合は「console.log(number7);」のように値へダイレクトにアクセスすることはできず、上記のようにvalueOfメソッドで値を取得する必要があります。

プリミティブ値の数値とNumberオブジェクトのインスタンスで作成する数値の違いは、typeof演算子で型を出力したときに戻り値が異なります。
しかし、数値を扱う上では大きな違いはなく、プリミティブ値の方が記述が簡略化できるので便利です。

計算不能なときの値について

変数number5の「NaN(Not a Number)」は計算不能なときの値です。
例えば、以下のように数値と文字列を使って計算を実行すると値がNaNになります。

コード例

console.log(1000 * 'a'); // NaN

有効な数値の範囲を超えた場合

もしJavaScriptで扱うことのできる数値の範囲を出てしまった場合は、変数number6のような無限数「Infinity」の値になります。

数値を使った計算

数値は四則演算をはじめとして様々な計算を実行することができます。
以下の例では基本的な計算を実行した結果をconsole.logメソッドで出力します。

コード例

var number1 = 100;
console.log(number1 + 45); // 145
console.log(number1 - 50); // 50
console.log(number1 * number2); // 0
console.log(number1 / 100); // 1
console.log(number1 % 8); // 4

プログラミングを経験されたことがあればお馴染みになりますが、掛け算は「*(アスタリスク)」を使い、割り算では「/(スラッシュ)」を使います。
割ったあとの余りを計算するときは「%(パーセント)」を使います。

四則演算の計算順序については数学のルールと同様に左から右に向かって順番に計算しますが、「+」や「」よりも「*」「/」「%」を先に計算します。

コード例

var number1 = 100;
console.log(50 / 5 * 10); // 100
console.log(number1 + 50 * 10 - 5 / 10); // 599.5
console.log((number1 + 50) * (10 - 5) / 10); // 75

1つ目の式は左から右に向かって順に計算をします。

2つ目の式は先に「50 * 10」と「5 / 10」を計算し、その後に左から順に「100 + 500 – 0.5」を計算します。

最後の式も四則演算が混在していますが、「()」を使って計算順序を制御しています。
計算は「()」の中にある式が優先されます。
そのため、「150 * 5 / 10」を計算して「75」になります。

扱うことのできる最大値と最小値を取得する

JavaScriptで正確に扱うことのできる数値の範囲を取得するときは、最大値を取得するMAX_SAFE_INTEGERプロパティと最小値を取得するMIN_SAFE_INTEGERプロパティを参照すると取得することができます。

コード例

// 最大値
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

// 最小値
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991

上記の出力結果から、正確に扱うことのできる数値の範囲は「9,007,199,254,740,991 〜 -9,007,199,254,740,991」になります。

正確に扱うことのできる数値ではなく、JavaScriptが扱うことのできる最大値と最小値を取得したいときについては、最大値を取得するMAX_VALUEプロパティと最小値を取得するMIN_VALUEプロパティを参照すると取得することができます。

コード例

// 最大値
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308

// 最小値
console.log(Number.MIN_VALUE); // 5e-324

e+308」は10の308乗です。
数値にすると途方もない桁数になりますが、ほとんどの場合では十分なのではないかと思います。

無限数を取得する

上記のMAX_VALUEプロパティMIN_VALUEプロパティで取得できるようなJavaScriptの扱うことのできる数値の範囲を超えてしまった場合は、値が無限数「Infinity」になります。

整数に0以上の「正の整数」と、-1以下の「負の整数」があるように、無限数についても「正の無限数」と「負の無限数」があります。
「正の無限数」はPOSITIVE_INFINITYプロパティ、「負の無限数」はNEGATIVE_INFINITYプロパティで取得することができます。

コード例

// 正の無限数
// console.log(Number.POSITIVE_INFINITY); // Infinity

// 負の無限
// console.log(Number.NEGATIVE_INFINITY); // -Infinity

整数か判定する

値が整数か確認したいときはisIntegerメソッドを使います。
整数であればtrue、それ以外はfalseを返します。

コード例

console.log(Number.isInteger(1)); // true
console.log(Number.isInteger(0.1)); // false
console.log(Number.isInteger(-1)); // true
console.log(Number.isInteger('5')); // false
console.log(Number.isInteger(NaN)); // false
console.log(Number.isInteger(Infinity)); // false

2番目の浮動小数点数、文字列の数字は整数ではないため戻り値はfalseになります。

NaNか判定する

値が「NaN」か確認したいときはisNaNメソッドを使います。
値が「NaN」ならtrue、それ以外はfalseを返します。

コード例

console.log(Number.isNaN(1)); // false
console.log(Number.isNaN(0.1)); // false
console.log(Number.isNaN(0)); // false
console.log(Number.isNaN('5')); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Infinity)); // false

NaN」のみtrueになり、文字列の数字や無限数を渡したときも戻り値はfalseになります。

値が有限数か確認する

値が有限数(無限数じゃない)か確認したいときはisFiniteメソッドを使います。
値が有限数なら(無限数じゃなければ)true、無限数はfalseを返します。

コード例

console.log(Number.isFinite(Infinity)); // false
console.log(Number.isFinite(NaN)); // false
console.log(Number.isFinite(1)); // true
console.log(Number.isFinite('5')); // false
console.log(Number.isFinite(5e+307)); // true
console.log(Number.isFinite(5e+308)); // false
console.log(Number.isFinite(-9007199254740991)); // true

JavaScriptの扱える数値の範囲を超えた「5e+308」は「Infinity」になるため、有限数ではないので返り値はfalseになります。

正確に扱える数値か確認する

値がJavaScriptが正確に扱うことができる数値の範囲内か確認したいときはisSafeIntegerメソッドを使います。
数値の範囲は最大値MAX_SAFE_INTEGERプロパティから最小値MIN_SAFE_INTEGERプロパティの間になります。
値がこの範囲内ならtrue、それ以外はfalseを返します。

コード例

console.log(Number.isSafeInteger(0)); // true
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)); // true
console.log(Number.isSafeInteger(9007199254740991)); // true
console.log(Number.isSafeInteger(9007199254740992)); // false

最後の「9007199254740992」はMAX_SAFE_INTEGERプロパティよりも1だけ多い数値ですが、範囲から出てしまうため戻り値はfalseになります。

値を整数に変換する

値をNumberの整数に変換したいときはparseIntメソッドを使います。

コード例

var number1 = new Number(1000);
var number2 = NaN;
var number3 = Infinity;

console.log(Number.parseInt('5')); // 5
console.log(Number.parseInt(0.001)); // 0
console.log(Number.parseInt(Math.PI)); // 3
console.log(Number.parseInt(number1)); // 1000
console.log(Number.parseInt(number2)); // NaN
console.log(Number.parseInt(number3)); // NaN

文字列の数字はNumberの数値に変換されます。
浮動小数点数については小数点以下を四捨五入して丸めた整数になります。

変数number1に入っているnew演算子で作成したNumberオブジェクトのインスタンスについては、プリミティブ値に変換した数値になります。
変数number2number3については数値ではないため、整数に変換できずNaNになります。

値を浮動小数点数に変換する

値をNumberの浮動小数点数に変換したいときはparseFloatメソッドを使います。

コード例

var number1 = new Number(10.001);
var number2 = NaN;
var number3 = Infinity;

console.log(Number.parseFloat('0.005')); // 0.005
console.log(Number.parseFloat(Math.PI)); // 3.141592653589793
console.log(Number.parseFloat(1)); // 1
console.log(Number.parseFloat(number1)); // 10.001
console.log(Number.parseFloat(number2)); // NaN
console.log(Number.parseFloat(number3)); // Infinity

文字列の数字はNumberの浮動小数点数に変換されます。
もともと浮動小数点数でない整数は「1.00」のように変換されず、そのまま整数の値として保持されます。

変数number1に入っているnew演算子で作成したNumberオブジェクトのインスタンスについては、プリミティブ値に変換したうえで浮動小数点数になります。
変数number2number3については数値ではないため、変換はされずそのままの値が戻り値になります。

指数表記にする

数値を指数表記の文字列にするときはtoExponentialメソッドを使います。
戻り値はNumberではなく、Stringの文字列になります。

以下の例ではプリミティブ値の入った変数number1と、Numberオブジェクトのインスタンスが入った変数number2に対してtoExponentialメソッドを使用して、戻り値を出力します。

コード例

// プリミティブ値
var number1 = 10000000000;
console.log(number1); // 10000000000
console.log(number1.toExponential()); // '1e+10'
console.log(number1.toExponential(2)); // '1.00e+10'
console.log(number1.toExponential(5)); // '1.00000e+10'

// Numberオブジェクトのインスタンス
var number2 = new Number(10000000000);
console.log(number2); // Number {10000000000}
console.log(number2.toExponential()); // '1e+10'
console.log(number2.toExponential(2)); // '1.00e+10'
console.log(number2.toExponential(5)); // '1.00000e+10'

変数number1number2に対してtoExponentialメソッドを実行して得られる値は全く同じ文字列になります。

第1パラメータには小数点以下の桁数を数値で指定することができます。
パラメータを省略すると小数点以下は省略します。

小数点以下の桁数を指定する

数値の小数点以下の桁数を指定するときはtoFixedメソッドを使います。
第1パラメータは小数点以下の桁数を指定することができ、省略すると小数点以下を四捨五入して丸めた数値を戻り値にします。

以下の例ではプリミティブ値の入った変数number1と、Numberオブジェクトのインスタンスが入った変数number2にそれぞれtoFixedメソッドを使用して、戻り値を出力します。

コード例

var number1 = 0.123456789;
console.log(number1.toFixed()); // 0
console.log(number1.toFixed(2)); // 0.12
console.log(number1.toFixed(5)); // 0.12346

var number2 = new Number(0.00001);
console.log(number2.toFixed()); // 0
console.log(number2.toFixed(2)); // 0.00
console.log(number2.toFixed(5)); // 0.00001

toFixedメソッドに第1パラメータを指定すると、その値より後ろの桁にある小数点数は四捨五入して丸めます。
上記の変数number1に対してtoFixed(2)を実行すると、小数点の第3位以下「0.003456789」を四捨五入し、「0.12」が戻り値になります。
同様にtoFixed(5)を実行したときは小数点の第5位以下「0.000006789」を四捨五入して「0.12346」が戻り値になります。

数値を文字列に変換する

数値を文字列に変換するときはtoStringメソッドを使います。
戻り値は文字列(String)のプリミティブ値になります。

コード例

var number1 = 12345;
var number2 = -100;
var number3 = 0.12345;
var number4 = NaN;
var number5 = Infinity;

console.log(number1.toString()); // '12345'
console.log(number2.toString()); // '-100'
console.log(number3.toString()); // '0.12345'
console.log(number4.toString()); // 'NaN'
console.log(number5.toString()); // 'Infinity'

負の値や小数点以下の値もそのまま文字列に変換します。
同様に、NaNInfinityもそのまま文字列に変換することができます。

言語にあった形式で数値を出力する

数値を言語にあった形式に変換するときはtoLocaleStringメソッドを使います。
このメソッドを使うと、数値に桁数を付けたり、通貨表記に変換することができます。
戻り値は文字列(String)のプリミティブ値です。

toLocaleStringメソッドのパラメータは必要に応じて指定することができ、第1パラメータには言語コード、第2パラメータには表記フォーマットを指定することができます。
省略したときは言語コードは初期値の「en-US」(アメリカ英語表記)を適用します。

コード例

var number1 = 12345;

console.log(number1.toLocaleString()); // '12,345'
console.log(number1.toLocaleString('ar-EG')); // '١٢٬٣٤٥'
console.log(number1.toLocaleString('ja-JP', {style:'currency', currency: 'JPY'})); // '¥12,345'
console.log(number1.toLocaleString('en-US', {style:'currency', currency: 'USD'})); // '$12,345.00'
console.log(number1.toLocaleString('de-DE', {style:'currency', currency: 'EUR'})); // '12.345,00 €'

第2パラメータの表記フォーマットはオブジェクト形式で指定します。
上記は上から順に「日本円」「米ドル」「ユーロ」の表記に変換しています。

値を出力

Numberオブジェクトのインスタンスを作成した場合はvalueofメソッドで数値(Number)を取得することができます。

コード例

var number1 = 12345;
var number2 = new Number(100);
var number3 = new Number(0.225);
var number4 = new Number(-110);
var number5 = new Number(NaN);
var number6 = new Number(Infinity);

console.log(number1.valueOf()); // 12345
console.log(number2.valueOf()); // 100
console.log(number3.valueOf()); // 0.225
console.log(number4.valueOf()); // -110
console.log(number5.valueOf()); // NaN
console.log(number6.valueOf()); // Infinity

変数number1のようなプリミティブ値でもvalueofメソッドは実行することができます。

数値がNaNInfinityである場合についても、値はそのまま取得します。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。