JavaScript 数値

JavaScript の数値型

JavaScript には一つの数値型しかありません。数値は小数点を伴うか伴わないかで書くことができます。


let x = 3.14;    // 小数点ありの数値
let y = 3;       // 小数点なしの数値

特大または特小の数値

科学的(指数)表記で特大または特小の数値を書くことができます:


let x = 123e5;    // 12300000
let y = 123e-5;   // 0.00123

JavaScript 数値は常に64ビット浮動小数点

他の多くのプログラミング言語とは異なり、JavaScript は整数、短整数、長整数、浮動小数点など、異なるタイプの数値を定義しません。

JavaScript の数値は常に国際的な IEEE 754 標準に従った倍精度浮動小数点数として保存されます。

このフォーマットでは、数値(分数)はビット 0 から 51 までに、指数はビット 52 から 62 までに、符号はビット 63 に保存されます:

整数の精度

整数(ピリオドや指数表記のない数値)は、15桁まで正確です。


let x = 999999999999999;   // x は 999999999999999 になります
let y = 9999999999999999;  // y は 10000000000000000 になります

浮動小数点の精度

浮動小数点演算は常に100%正確ではありません:


let x = 0.2 + 0.1;

上記の問題を解決するために、乗算と除算が役立ちます:


let x = (0.2 * 10 + 0.1 * 10) / 10;

数値と文字列の追加

注意: JavaScript は + 演算子を追加と連結の両方に使用します。

数値を追加すると、結果は数値になります:


let x = 10;
let y = 20;
let z = x + y;

文字列を追加すると、結果は文字列の連結になります:


let x = "10";
let y = "20";
let z = x + y;

数値と文字列を追加すると、結果は文字列の連結になります:


let x = 10;
let y = "20";
let z = x + y;

文字列と数値を追加すると、結果は文字列の連結になります:


let x = "10";
let y = 20;
let z = x + y;

以下の結果が30になると期待するのは一般的な間違いです:


let x = 10;
let y = 20;
let z = "The result is: " + x + y;

以下の結果が102030になると期待するのは一般的な間違いです:


let x = 10;
let y = 20;
let z = "30";
let result = x + y + z;

JavaScript インタープリターは左から右に作業を行います。

最初に x と y が数値であるため、10 + 20 が追加されます。

次に z が文字列であるため、30 + “30” が連結されます。

数値文字列

JavaScript の文字列には数値の内容が含まれることがあります:


let x = 100;         // x は数値です
let y = "100";       // y は文字列です

JavaScript は、すべての数値演算において文字列を数値に変換しようとします:

これは動作します:


let x = "100";
let y = "10";
let z = x / y;

これも動作します:


let x = "100";
let y = "10";
let z = x * y;

そしてこれも動作します:


let x = "100";
let y = "10";
let z = x - y;

しかし、これは動作しません:


let x = "100";
let y = "10";
let z = x + y;

最後の例では JavaScript は + 演算子を使用して文字列を連結します。

NaN – Not a Number

NaN は JavaScript の予約語であり、数値が正当な数値ではないことを示します。

非数値の文字列で算術演算を試みると、NaN(Not a Number)になります:


let x = 100 / "Apple";

ただし、文字列が数値であれば、結果は数値になります:


let x = 100 / "10";

値が NaN であるかどうかを知るために、グローバル JavaScript 関数 isNaN() を使用できます:


let x = 100 / "Apple";
isNaN(x);

NaN に注意してください。NaN を数学的な操作で使用すると、結果も NaN になります:


let x = NaN;
let y = 5;
let z = x + y;

または、NaN5 のような連結になる可能性があります:


let x = NaN;
let y = "5";
let z = x + y;

NaN は数値です: typeof NaN は number を返します:


typeof NaN;

Infinity

Infinity(または -Infinity)は、JavaScript が最大の可能な数を超えて計算した場合に返す値です。


let myNumber = 2;
// 無限に実行
while (myNumber != Infinity) {
  myNumber = myNumber * myNumber;
}

0(ゼロ)での除算も Infinity を生成します:


let x =  2 / 0;
let y = -2 / 0;

Infinity は数値です: typeof Infinity は number を返します。


typeof Infinity;

16進数

JavaScript は、16進数で数値定数を解釈します。これには 0x が先行する必要があります。


let x = 0xFF;

0 の先頭にゼロを付けて数値を書くことは絶対にしません(例:07のように)。

一部の JavaScript のバージョンでは、先頭にゼロを付けることで 8進数として数値を解釈します。

デフォルトでは JavaScript は数値を 10進数の小数点表示として表示します。

ただし、toString() メソッドを使用して、2進数から36進数までの数値を出力することができます。

16進数は基数16です。10進数は基数10です。8進数は基数8です。2進数は基数2です。


let myNumber = 32;
myNumber.toString(32);
myNumber.toString(16);
myNumber.toString(12);
myNumber.toString(10);
myNumber.toString(8);
myNumber.toString(2);

JavaScript 数値をオブジェクトとして

通常、JavaScript の数値はリテラルから生成されるプリミティブ値です:


let x = 123;

しかし、数値はキーワード new を使用してオブジェクトとして定義することもできます:


let y = new Number(123);


let x = 123;
let y = new Number(123);

Number オブジェクトを作成しないでください。

new キーワードはコードを複雑にし、実行速度を遅くします。

Number オブジェクトは予期しない結果を生じることがあります:

== 演算子を使用すると、x と y は等しいです:


let x = 500;
let y = new Number(500);

=== 演算子を使用すると、x と y は等しくありません。


let x = 500;
let y = new Number(500);

(x==y) は true または false ですか?


let x = new Number(500);
let y = new Number(500);

(x===y) は true または false ですか?


let x = new Number(500);
let y = new Number(500);

2つの JavaScript オブジェクトを比較すると、常に false が返されます。