JavaScript の数値
1. 数値の型(Number Types)
JavaScript において、数値の型は一種のみです。数値は小数点を付けて記述することも、付けずに記述することも可能です。
1.1 基本的な例
let x = 3.14; // 小数点ありの数値
let y = 3; // 小数点なしの数値非常に大きな数値や非常に小さな数値は、指数表記(Scientific notation / Exponent notation)を使用して記述できます。
let x = 123e5; // 12300000 と同等
let y = 123e-5; // 0.00123 と同等2. JavaScript の数値は常に 64bit 浮動小数点数
多くのプログラミング言語とは異なり、JavaScript は整数(Integer)、短精度(Short)、長精度(Long)、単精度浮動小数点数(Floating-point)などの異なる数値型を定義していません。
JavaScript の数値は、常に国際標準である IEEE 754 規格に従い、倍精度浮動小数点数(Double precision floating point numbers)として保存されます。
このフォーマットでは、数値は 64 ビットで保存され、ビット 0 から 51 に数値(仮数部)、ビット 52 から 62 に指数部、ビット 63 に符号が格納されます。
| 項目 | ビット幅 | 範囲 |
|---|---|---|
| 仮数部(Fraction/Mantissa) | 52 ビット | 0 - 51 ビット |
| 指数部(Exponent) | 11 ビット | 52 - 62 ビット |
| 符号(Sign) | 1 ビット | 63 ビット |
他の言語では、整数(byte, short, int, long)や実数(float, double)などの型が使い分けられますが、JavaScript では常に 64bit 浮動小数点数(double) です。
3. 精度の限界
3.1 整数の精度
整数(ピリオドや指数表記のない数値)は、15 桁まで正確に保たれます。
let x = 999999999999999; // x は 999999999999999
let y = 9999999999999999; // y は 10000000000000000 になるまた、小数点の最大桁数は 17 桁です。
3.2 浮動小数点の精度
浮動小数点演算は常に 100% 正確であるとは限りません。
let x = 0.2 + 0.1; // 0.30000000000000004 になるこの問題を解決するには、一度整数に掛けてから割る方法が有効です。
let x = (0.2 * 10 + 0.1 * 10) / 10; // 0.34. 数値と文字列の加算(暗黙の型変換)
JavaScript では、+ 演算子を加算(Addition)と文字列結合(Concatenation)の両方に使用します。4.1 数値同士の加算
数値同士を加算すると、結果は数値になります。
let x = 10;
let y = 20;
let z = x + y; // 30 (数値)4.2 文字列同士の加算
文字列同士を加算すると、文字列として結合されます。
let x = "10";
let y = "20";
let z = x + y; // "1020" (文字列)4.3 数値と文字列の混合
数値と文字列を足すと、結果は文字列の結合になります。
let x = 10;
let y = "20";
let z = x + y; // "1020" (文字列)また、インタープリタは左から右へ処理を行うため、順序によって結果が変わります。
let x = 10;
let y = 20;
let z = "30";
let result = x + y + z; // "3030"※ 最初に 10 + 20 が計算されて 30(数値)になり、その後 "30"(文字列)と結合されます。
5. 数値形式の文字列(Numeric Strings)
JavaScript の文字列は、数値の内容を持つことができます。+ 演算子以外のすべての数値演算において、JavaScript は文字列を数値に変換しようと試みます。
let x = "100";
let y = "10";
let z1 = x / y; // 10 (成功)
let z2 = x * y; // 1000 (成功)
let z3 = x - y; // 90 (成功)
let z4 = x + y; // "10010" (失敗: 文字列結合になる)6. NaN - Not a Number
NaN は、その数値が正当な数値ではないことを示す JavaScript の予約語です。
数値ではない文字列に対して算術演算を行おうとすると、結果は NaN になります。
let x = 100 / "Apple"; // NaNグローバル関数 isNaN() を使用して、値が数値でないかどうかを判定できます。
let x = 100 / "Apple";
isNaN(x); // true6.1 NaN の注意点
数学的演算に NaN を使用すると、結果も NaN になります。また、文字列結合に使用されると "NaN5" のようになります。
重要なのは、typeof NaN は number を返すという点です。
7. Infinity
Infinity(または -Infinity)は、JavaScript が扱える最大値を超えた場合に返される値です。
let myNumber = 2;
while (myNumber != Infinity) {
myNumber = myNumber * myNumber;
}また、0 での除算(Division by zero)も Infinity を生成します。
let x = 2 / 0; // Infinity
let y = -2 / 0; // -InfinityInfinity も数値型であり、typeof Infinity は number を返します。
8. 16進数(Hexadecimal)
JavaScript では、定数の前に 0x が付いている場合、それを 16 進数として解釈します。
let x = 0xFF; // 25507 のように先頭に 0 を付けて数値を書かないでください。一部のバージョンではこれを 8 進数(Octal)として解釈することがあります。
8.1 進数変換
toString() メソッドを使用することで、数値を 2 進数から 36 進数まで出力できます。
let myNumber = 32;
myNumber.toString(16); // "20" (16進数)
myNumber.toString(10); // "32" (10進数)
myNumber.toString(2); // "100000" (2進数)9. オブジェクトとしての数値
通常、JavaScript の数値はリテラルから作成されるプリミティブ値ですが、new キーワードを使用してオブジェクトとして定義することも可能です。
let y = new Number(123);数値オブジェクトは作成しないでください。
new キーワードはコードを複雑にし、実行速度を低下させます。また、比較演算において予期せぬ挙動を示します。
let x = 500;
let y = new Number(500);
(x == y) // true (値が同じ)
(x === y) // false (型が異なる: プリミティブ vs オブジェクト)さらに、2つの JavaScript オブジェクトを比較すると常に false になります。
let x = new Number(500);
let y = new Number(500);
(x == y) // false