このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Number

Baseline
広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。

Number (数値)の値は 37-9.25 のような浮動小数点数を表します。

Number コンストラクターは、数値を扱うための定数とメソッドを含んでいます。他の型の値は Number() 関数を用いて数値に変換することができます。

解説

数値は、2553.14159 のようなリテラル形式で表現するのが最も一般的です。字句文法には、より詳しい参照があります。

js
255; // 二百五十五
255.0; // 同じ数値
255 === 255.0; // true
255 === 0xff; // true (16 進記法)
255 === 0b11111111; // true (2 進記法)
255 === 0.255e3; // true (10 進指数記法)

JavaScript コードにおける 37 のような数値リテラルは浮動小数点値であり、整数ではありません。日常的に使用される独立した整数型はありません。(JavaScript は長整数 (BigInt) 型を持つようになりましたが、日常の利用で数値を置き換えるように設計されてはいません。 37 は数値であり、長整数ではありません。)

関数として使用された場合、 Number(value) は文字列やその他の値を数値型に変換します。値が変換できない場合は、 NaN を返します。

js
Number("123"); // 数値 123 を返す
Number("123") === 123; // true

Number("unicorn"); // NaN
Number(undefined); // NaN

数値のエンコーディング

JavaScript の数値 (Number) 型は IEEE 754 の倍精度 64ビットバイナリー形式であり、 Java や C# の double のようなものです。つまり、小数値を表しますが、格納される数値の大きさと精度には制限があります。とても簡単に説明すると、IEEE 754 の倍精度数は、3 つの部分を表すのに 64 ビットを使用します。

  • 1 ビットの符号(sign, 正の数または負の数)
  • 11 ビットの指数部(exponent, -1022 から 1023)
  • 52 ビットの仮数部(mantissa, 0 と 1 の間の数値を表す)

仮数部(significand とも呼ばれる)は、実際の値を表す部分(有効数字)です。指数は、仮数を乗じるべき 2 のべき乗です。科学的記数法として考えると、次のようになります。

Number=(1)sign(1+mantissa)2exponent\text{Number} = ({-1})^{\text{sign}} \cdot (1 + \text{mantissa}) \cdot 2^{\text{exponent}}

仮数部は 52 ビットで格納され、2 進数の小数でいうところの 1.… 以降の桁と解釈されます。したがって,仮数部の精度は 2-52Number.EPSILON で取得可能)、すなわち 10 進で 15 ~ 17 桁程度の有効数字となります。演算は丸め誤差の影響を受けます。

数値が保持できる最大の値は 21023 × (2 - 2-52)(2 進数で指数が 1023、仮数が 0.1111...)であり、これは Number.MAX_VALUE で取得可能です。それ以上の値は、特殊な数値定数 Infinity で置き換えられます。

整数は、仮数が 53 ビット(先頭の 1 も含む)しか保持できないため、精度を落とさずに表せるのは -253 + 1 から 253 - 1 の範囲(Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER で取得できる)だけです。

これについては、ECMAScript 標準に記述されています。

数値への変換

数字を期待する多くの組み込み演算は、最初に引数を数字に変換します(Numberオブジェクトが数字プリミティブと似たような動作をするのは、このためです)。この操作 は以下のように要約されます。

  • 数値はそのまま返されます。
  • undefinedNaN になります。
  • null0 になります。
  • true1 に、false0 になります。
  • 文字列は、数値リテラルが入っているかのように解釈して変換されます。解釈に失敗した場合は NaN が返されます。実際の数値リテラルと比較すると、いくつかの異なる点があります。
    • 先頭および末尾のホワイトスペース/改行文字は無視されます。
    • 先頭が数字 0 である場合、数値が 8 進数のリテラルとなる(または厳格モードで拒否される)ことはありません。
    • 文字列の始めには、符号を示すために +- を置くことができます。(実際のコードでは、これらはリテラルの一部に「見える」のですが、実際には別個の単項演算子です。)ただし、符号は一度しか現れず、空白が続いてはいけません。
    • Infinity-Infinity はリテラルとして認識されます。実際のコードでは、これらはグローバル変数です。
    • 空文字列またはホワイトスペースのみの文字列は 0 に変換されます。
    • 数値の区切り文字は許可されません。
  • 長整数は、意図しない精度の低下を防ぐために TypeError 例外が発生します。
  • シンボルTypeError 例外が発生します。
  • オブジェクトはまずプリミティブに変換されます[Symbol.toPrimitive]()"number" のヒント付きで、valueOf()toString() メソッドをこの順で呼び出すことで)。結果のプリミティブは数値へ変換されます。

JavaScript でほぼ同じ効果を得るには、2 つの方法があります。

  • 単項プラス: +x は上で説明した数値変換の手順を、x を変換するためにそのまま実行します。
  • Number() 関数: Number(x)x を変換する同じアルゴリズムを使用します。ただし長整数TypeError 例外を発生させず、精度が落ちる可能性があるものの、数値としての値を返します。

Number.parseFloat() および Number.parseInt()Number() と似ていますが、文字列のみを若干異なる解釈ルールで変換します。例えば、parseInt() は小数点を解釈せず、 parseFloat()0x の接頭辞を解釈しません。

整数への変換

演算子の中には整数を期待するものがあり ます。特に、配列や文字列の添字、時刻の成分、数値の基数を扱う演算子はそうです。上記の数値強制の手順を実行した後、結果は切り捨てて(小数部分を捨てて)整数に変換します。数値が無限大 (±Infinity) の場合は、そのまま返します。数値が NaN または -0 の場合、0 を返します。したがって、結果は常に整数(-0ではない)か ±Infinity となります。

注目すべきは、整数に変換すると undefinednull0 になることです。これは undefinedNaN に変換され、これも 0 になるためです。

固定長数値への変換

JavaScript には整数の 2 進数エンコーダーを処理する低レベルの関数がいくつかあり、特にビット演算子TypedArray オブジェクトが有名です。ビット演算子は常にオペランドを 32 ビット整数に変換します。この場合、値を数値に変換した後、最初の切り捨てで小数部を取り除き、次に整数の 2 の補数で最低ビットを導いて、数値を指定の幅に正規化します。

js
new Int32Array([1.1, 1.9, -1.1, -1.9]); // Int32Array(4) [ 1, 1, -1, -1 ]

new Int8Array([257, -257]); // Int8Array(2) [ 1, -1 ]
// 257 = 0001 0000 0001
//     =      0000 0001 (mod 2^8)
//     = 1
// -257 = 1110 1111 1111
//      =      1111 1111 (mod 2^8)
//      = -1 (as signed integer)

new Uint8Array([257, -257]); // Uint8Array(2) [ 1, 255 ]
// -257 = 1110 1111 1111
//      =      1111 1111 (mod 2^8)
//      = 255 (as unsigned integer)

コンストラクター

Number()

Number オブジェクトを生成します。関数として呼び出された場合は、数値型のプリミティブ値を返します。

静的プロパティ

Number.EPSILON

数値として表される 2 個の数の最小の差です。

Number.MAX_SAFE_INTEGER

JavaScript における確実な整数の最大値 (253 - 1) です。

Number.MAX_VALUE

表現可能な正の数の最大値です。

Number.MIN_SAFE_INTEGER

JavaScript における確実な整数の最小値 (-(253 - 1)) です。

Number.MIN_VALUE

表現可能な正の数の最小値。0 に最も近い正の数です(0 ではありません)。

Number.NaN

特殊な "Not a Number" (数値ではない)の値です。

Number.NEGATIVE_INFINITY

負の無限大を表す特別な値です。オーバーフロー時に返されます。

Number.POSITIVE_INFINITY

無限大を表す特別な値です。オーバーフロー時に返されます。

静的メソッド

Number.isFinite()

渡された値が有限数であるかどうかを判断します。

Number.isInteger()

渡された値が整数であるかどうかを判断します。

Number.isNaN()

渡された値が NaN であるかどうかを判断します。

Number.isSafeInteger()

渡された値が確実な範囲の整数(-(253 - 1) から 253 - 1 の間)であるかどうかを判断します。

Number.parseFloat()

これはグローバルの parseFloat() 関数と同じです。

Number.parseInt()

これはグローバルの parseInt() 関数と同じです。

インスタンスプロパティ

これらのプロパティは Number.prototype に定義されており、すべての Number インスタンスで共有されます。

Number.prototype.constructor

インスタンスオブジェクトを作成したコンストラクター関数。Number インスタンスの場合、初期値は Number コンストラクターです。

インスタンスメソッド

Number.prototype.toExponential()

指数表記で数値を表す文字列を返します。

Number.prototype.toFixed()

固定小数点表記で数値を表す文字列を返します。

Number.prototype.toLocaleString()

この値を言語依存の表現で表す文字列を返します。 Object.prototype.toLocaleString() メソッドを上書きします。

Number.prototype.toPrecision()

指定された精度で、固定小数点表記または指数表記で数値で表す文字列を返します。