JavaScript 速習チュートリアル

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.3

4. 数値と文字列の加算(暗黙の型変換)

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); // true

6.1 NaN の注意点

数学的演算に NaN を使用すると、結果も NaN になります。また、文字列結合に使用されると "NaN5" のようになります。
重要なのは、typeof NaNnumber を返すという点です。

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; // -Infinity

Infinity も数値型であり、typeof Infinitynumber を返します。

8. 16進数(Hexadecimal)

JavaScript では、定数の前に 0x が付いている場合、それを 16 進数として解釈します。

let x = 0xFF; // 255

07 のように先頭に 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