コンテンツにスキップ

JavaScript/数値

出典: フリー教科書『ウィキブックス(Wikibooks)』

JavaScriptにおける数値プリミティブは、数値を表すための基本的なデータ型です。 数値プリミティブは、整数や小数など、さまざまな数値を表現することができます。 JavaScriptの数値は、通常の10進数の他に、16進数、8進数、2進数の表現もサポートしています。 また、数値プリミティブは、数学的な演算を行うための様々なメソッドを提供しています。 このチュートリアルでは、JavaScriptの数値プリミティブについて、基本的な概念や使用方法を紹介します。

Numberオブジェクトは数値プリミティブのラッパーオブジェクトです。

概要

[編集]

JavaScriptでは数値を浮動小数点数でサポートされています(ここでは数値と長整数(bigint)は別のものとして扱います)。 浮動小数点数とは、コンピュータで用いられる実数の近似で、IEEE 75464ビット倍精度浮動小数点数が使われます。

数値リテラル

[編集]

数値リテラル(Numeric literal)は次のような形をしています。

42
42.0 // 上と同じ値
-1
0
864e5
0xFFFF

このコードは、6つの数値リテラルを含んでいます。それぞれのリテラルの詳細を解説します。

  • 42: 整数リテラルで、値は 42 です。
  • 42.0: 小数リテラルで、値は 42.0 です。小数部が 0 であるため、整数リテラルと同じ値になります。
  • -1: 負の整数リテラルで、値は -1 です。
  • 0: 整数リテラルで、値は 0 です。
  • 864e5: 指数表記の数値リテラルで、値は 86400000 です。 e の後に続く数字は、10の何乗かを表します。この場合、5が指定されているため、864e586400000 と等価です。
  • 0xFFFF: 16進数表記の整数リテラルで、値は 65535 です。0x の後に16進数が続くことで、16進数として解釈されます。

JavaScriptには2進数や8進数の整数リテラルはありませんでしたが、ECMA-262第6版で導入されました。

0b1101 // 13
0o3162 // 1650

これらのコードは、JavaScriptにおける数値リテラルの別の形式を示しています。

  • 0b1101 は、2進数表記で1310を表しています。プレフィックスの 0b が2進数表記であることを示しており、その後に2進数の数字が続きます。13は2進数表記では 1101 となります。
  • 0o3162 は、8進数表記で165010を表しています。プレフィックスの 0o が8進数表記であることを示しており、その後に8進数の数字が続きます。1650は8進数表記では 3162 となります。

これらの数値リテラルは、通常の10進数表記以外にも2進数や8進数で数値を表現することができるため、より柔軟な表現が可能です[1]

0を前置する8進数の整数リテラルは過去にサポートされていましたがECMA-262第3版で削除されました。多くの処理系では後方互換のために依然として8進数の整数リテラルをサポートしていますが、非推奨とされstrictモードに於いてはエラーになります。

数値リテラルに区切り文字としての '_' 使う形式が、ES2021で導入されました[2]

1_234_567
2_3_5_7_11

使うかどうかは任意で、3桁ごとに置くなどの制限はありません。 数値の、先頭に '_' を置くと識別子になってしまいます。 数値の末尾に '_' を置くと SysnatxError となります。 '_' を2つ以上続けても SysnatxError となります。

0.5
.5 // 上と同じ値
-1.4142135623730951
3.141592653589793
1.0e-8

1.0e-8、すなわち0.00000001と等しい数値です。 小数点を伴った数値リテラルは、10進数に限られそれ以外の基数で小数点をつかうと Syntax Error になります。

JavaScriptでは整数と浮動小数点数は区別されません

[編集]

JavaScriptでは、数値は整数も浮動小数点数も区別されず、数値は64ビット倍精度浮動小数点数として表されます。この表現方法は、有理数を2進数で表現するための方法で、64ビット浮動小数点数は1ビットの符号、11ビットの指数、そして52ビットの仮数から構成されます。これにより、最大値、最小値、精度、そしてゼロと無限大といった特殊な値を表現することができます。

64ビット倍精度浮動小数点数で整数を表現できる最小値と最大値は、それぞれNumber.MIN_SAFE_INTEGERとNumber.MAX_SAFE_INTEGERで提供されます。JavaScriptの数値は、整数でも小数でも、同じ64ビット浮動小数点数として扱われます。例えば、整数の1と浮動小数点数の1.0は、内部的には同じ数値として扱われます。typeof演算子を数値に適用すると、値に関係なく"number"を返します。

数値が(精度が失われているにしても)整数であるかは、Number.isInteger(number)で、精度を失っていない整数であるかは、Number.isSafeInteger(number)で調べることが出来ます。

JavaScriptの数値型は、一般的な数値演算に加え、ビット演算子やシフト演算子を使用してビットレベルの演算を行うことができます。ビット演算は64ビット倍精度浮動小数点数を32ビット符号付き整数に変換してから演算されます。

ただし、符号なし右シフト演算子>>>だけは、-1>>>1 === 2147483647のように結果が正になる特殊な挙動を示します。

JavaScriptの数値の型

C言語の数値変数には、整数型(int)や浮動小数型(float)などといった型があります。 しかし JavaScript の数は倍精度の64ビットの浮動小数しかなく整数型は浮動小数の仮数部を使って表現されます。

これはプリミティブな「数値」(number)の場合で、BigIntやTypedArrayは異なる内部構造を持っています。

数値の取り得る特殊な値

[編集]

NaN

[編集]

NaN(Not a Number)は、「非数」を意味するJavaScriptの特殊な値です。 NaNは、数値として評価できない演算結果を示すために使用されます。 例えば、0を0で割った結果や、0/0、Infinity/Infinity、文字列を数値として評価できない場合などです。

NaNは、数値でない値を数値型に強制変換する試み(parseInt()やparseFloat()など)でも生成されます。

JavaScriptでは、NaN === NaNはfalseです。 これは、NaNが数値ではないため、自身を含むどんな値とも等しくならないためです。 isNaN()関数を使用すると、引数がNaNであるかどうかを確認できます。

Infinity

[編集]

JavaScriptのInfinityは、数値の特別な値の1つで、正の無限大を表します。これは、数値が最大値を超えた場合や、0で割り算をした場合など、いくつかの演算の結果として生成されることがあります。

たとえば、以下のコードでは、正の無限大を表すInfinityが返されます。

let x = 1 / 0; // xはInfinity

また、負の無限大を表す-Infinityも存在します。これは、以下のようにして生成できます。

let y = -1 / 0; // yは-Infinity

Infinityは数値として扱われるため、他の数値との演算も可能です。たとえば、以下のようにInfinityに数値を掛けたり、割ったりすることができます。

console.log(Infinity * 2); // 結果: Infinity
console.log(Infinity / 2); // 結果: Infinity

ただし、Infinityに0をかけたり、Infinityを0で割ったりすると、NaNが生成されます。

console.log(Infinity * 0); // 結果: NaN
console.log(Infinity / 0); // 結果: Infinity

-0

[編集]

JavaScriptには、通常の0とは異なる「負の0」と呼ばれる値があります。これは、符号ビットが1で指数と仮数が0の64ビット浮動小数点数です。つまり、-0は実際には0と同じように振る舞いますが、比較演算や一部の計算で異なる結果を返すことがあります。

例えば、-0と0を比較する場合、-0 === 0 はtrueになりますが、Object.is(-0, 0) はfalseになります。また、1/-0は-Infinityになりますが、1/0はInfinityになります。

JavaScriptの-0は、通常の0と同様に扱うことができますが、数値の符号に敏感な演算においては、異なる動作を示すことがあります。

Numberオブジェクト

[編集]

NumberオブジェクトはJavaScriptのプリミティブ型である数値型をラップします。 Number() コンストラクターは、与えられた引数をNumberオブジェクトに変換します。

例えば、以下のようにしてNumberオブジェクトを使用して数値を作成することができます。

const num1 = new Number(123); // num1 is an instance of the Number object
const num2 = Number("123"); // num2 is a primitive value of type number

上記の例では、num1はNumberオブジェクトのインスタンスであり、num2はNumber() コンストラクターを使用して作成されたプリミティブ型の数値です。

注意点としては、Number() コンストラクターを使用すると、引数が数値以外の場合、自動的に型変換が行われ、NaNが返される可能性があることです。例えば、以下のように文字列を渡した場合、NaNが返されます。

const num3 = new Number("abc"); // num3 will be NaN

NumberオブジェクトのインスタンスとJavaScriptの数値は厳密には等しくないことに注意してください。

new Number(1) ==  1; // true
// しかし
new Number(1) === 1; // false

/*
 * なぜならば
 * typeof new Number(1) == 'object' かつ
 * typeof 1             == 'number' なので
 */

ただし、プリミティブ型の数値に対してメソッド呼び出しをすると自動的に Number オブジェクトが作られます。

また、Number 関数により他の型の値をプリミティブ型の数値に型変換します。

var two = Number("2");

静的プロパティ

[編集]
MAX_VALUE
JavaScriptで表すことのできる最大の数
MIN_VALUE
JavaScriptで表すことのできる最小の数
NaN
非数
NEGATIVE_INFINITY
負の無限大
POSITIVE_INFINITY
正の無限大 (Infinity)
prototype
Numberオブジェクトのプロトタイプ

静的メソッド

[編集]
toExponential(fractionDigits=undefined)
toFixed(digits=0)
toLocaleString()
toPrecision()
toString(radix=10)
このオブジェクトのradix進数文字列表現を返す。
valueOf()
このオブジェクトのプリミティブ値を返す。
ES6でNumber組み込みオブジェクトに追加されたプロパティ

ES6 で幾つかの定数とメソッドがNumber組み込みオブジェクトに追加されました。

Number.EPSILON
1より大きい最小の数と1の差(計算機イプシロン
Number.MIN_SAFE_INTEGER
安全な整数の最小値
Number.MAX_SAFE_INTEGER
安全な整数の最大値
Number.isFinite(number)
isFinite(number)
number が無限大であれば真を返す
Number.isInteger(number)
number が整数であれば真を返す
Number.isSafeInteger(number)
number が安全な整数の最大値と安全な整数の最小値の間にある整数であれば真を返す
Number.isNaN(number)
isNaN(number)
number が NaN であれば真を返す


数値リテラル中にはアンダースコア(_)を置くことが出来ます

[編集]

JavaScriptにおいて、アンダースコア(_)は数値リテラル中で使用することができます。この機能は ECMAScript 2021 で追加されました。 アンダースコアを使用することで、数値リテラルの可読性を向上させることができます。たとえば、以下のように数値リテラルにアンダースコアを挿入することができます。

const num = 1_000_000;
console.log(num); // 1000000

このように、数値リテラルにアンダースコアを挿入することで、桁区切りを明示的に表現することができます。 ただし、アンダースコアは数値の先頭や末尾、小数点の前後には使用できません。また、連続して複数のアンダースコアを挿入することもできません。

附録

[編集]

チートシート

[編集]
// 数値リテラルの例
const decimal = 1234;           // 10進数
const binary = 0b01010101;      // 2進数
const octal = 0o755;            // 8進数
const hexadecimal = 0x1AEF;     // 16進数
const exponential = 3.14e2;     // 指数表記

// 数値の特別な値の例
const positiveInfinity = Infinity;    // 正の無限大
const negativeInfinity = -Infinity;   // 負の無限大
const notANumber = NaN;               // Not a Number

// 数値の演算の例
const sum = 1 + 2;              // 加算
const difference = 3 - 4;       // 減算
const product = 5 * 6;          // 乗算
const quotient = 7 / 8;         // 除算
const remainder = 9 % 10;       // 剰余

// 数値の比較の例
const greaterThan = 11 > 12;    // 大なり
const lessThan = 13 < 14;       // 小なり
const greaterThanOrEqual = 15 >= 16;   // 大なりイコール
const lessThanOrEqual = 17 <= 18;      // 小なりイコール
const equal = 19 == '19';       // 等価(型の変換がある)
const strictEqual = 20 === 20;  // 厳密等価(型の変換がない)

チートシート

[編集]
  1. Integer(整数):小数点以下の数値部分を持たない数値のこと。
  2. Floating-point number(浮動小数点数):小数点以下の数値部分を持つ数値のこと。
  3. Infinity(無限大):JavaScriptで表現可能な最大の数値を超えた値のこと。Infinityは数値であり、計算結果に参加することができます。
  4. NaN(非数):数値として表現できない値のこと。NaNは数値ではありませんが、計算結果に参加することができます。
  5. Number.MAX_VALUE:JavaScriptで表現可能な最大の数値の値。この値より大きな数値はInfinityとして扱われます。
  6. Number.MIN_VALUE:JavaScriptで表現可能な最小の正の数値の値。この値より小さい数値は0として扱われます。
  7. parseInt():文字列を整数に変換する関数。
  8. parseFloat():文字列を浮動小数点数に変換する関数。
  9. toFixed():数値を固定小数点表記の文字列に変換するメソッド。
  10. toExponential():数値を指数表記の文字列に変換するメソッド。
  11. toPrecision():数値を指定された桁数で表現する文字列に変換するメソッド。
  12. Mathオブジェクト:JavaScriptにおいて数学的な計算を行うためのメソッドを提供するオブジェクト。例えば、Math.PIは円周率を表します。
  13. Math.round():与えられた数値を最も近い整数に丸めるメソッド。
  14. Math.ceil():与えられた数値以上の最小の整数を返すメソッド。
  15. Math.floor():与えられた数値以下の最大の整数を返すメソッド。
  16. Math.abs():与えられた数値の絶対値を返すメソッド。
  17. Math.random():0以上1未満の範囲でランダムな数値を返すメソッド。

脚註

[編集]
  1. ^ ECMA-262 6th Edition 11.8.3 Numeric Literals
  2. ^ tc39/proposal-numeric-separator: A proposal to add numeric literal separators in JavaScript.

関連項目

[編集]
  • Math - 数学関数と定数

外部リンク

[編集]