JavaScriptの数値には、2つの異なる種類があります。数値と「bigint」です。
数値は最もよく使われるもので、倍精度64ビット浮動小数点形式で数値データ型を表します。
number: 倍精度64ビット浮動小数点形式(IEEE 754)の数値データ型です。
例として、-6、-2.4、0、0.1、1、3.14、16.984025、25、976、1024.0、500000があります。bigint: 任意精度形式の_整数_を表せる数値データ型です。
例として、-12n、0n、4n、9007199254740991nがあります。let numericValue = 42;
// => 42
42のような数値リテラルは、JavaScriptのコードでは整数ではなく浮動小数点値です。日常的に使う独立した整数型は存在しません。bigint型は、日常的な用途でnumber型を置き換えるために設計されたものではありません。42は依然としてNumberであり、BigIntではありません。
数値は、0b101、0o13、0x0Aのようなリテラル形式で表すこともできます。数値リテラルの文法についてはこちらで詳しく学べます。
E表記は、10のべき乗を掛けた数値を表します。E表記の形式は、数値の後にeまたはEを書き、その後に掛ける10のべき乗を続けます。
const num = 3.125e7;
// => 31250000
// The notation essentially says, "Take 3.125 and multiply it by 10^7".
E表記は、非常に小さな数を表すのにも使えます。
const num = 325987e-6; // Equals 0.325987
// The notation essentially says, "Take 325987 and multiply it by 10^-6.
アンダースコアを使うと、大きな数値を読みやすくできます。コンパイラーはアンダースコアを完全に無視します。
const num = 1_000_000; // You can read this as 1,000,000
console.log(num);
// => 1000000
数値を扱うときに役立つ組み込みオブジェクトが2つあります。
Number: よく使う値や便利な値の静的プロパティ、型チェックと型変換の静的メソッド、型変換と数値を文字列に整形するためのインスタンスメソッドを持ちます。Math: 数学的な定数と関数のプロパティとメソッドを持ちますが、BigIntでは動作しません。Mathには数値を丸めるメソッドもあります。利用できる丸めの選択肢については、このjavascript.infoの丸めに関する記事で詳しく読めます。
Math.floor(234.34); // => 234
Math.ceil(234.34); // => 235
Number組み込みグローバルobjectは、数値のような_ほとんどすべての_ものをnumberに変換するために使えるグローバルfunctionでもあります。stringをnumberに_パースする_よりも融通が利きません。
const date = new Date('December 17, 1995 03:24:00');
const unix = Number(date);
unix;
// => 819199440000
JavaScriptの数値には、3つの種類の最大値(および最小値/負の最大値)があります。
VALUE: Number.MAX_VALUEとNumber.MIN_VALUEで与えられます。INFINITY: Number.POSITIVE_INFINITYとNumber.NEGATIVE_INFINITYで与えられます。SAFE_INTEGER: Number.MAX_SAFE_INTEGERとNumber.MIN_SAFE_INTEGERで与えられます。JavaScriptでの数値の実装方法のため、Number.MIN_VALUEとNumber.MAX_VALUEの間のすべての数値が表せるわけではありません。しかし、Number.MIN_SAFE_INTEGER - 1とNumber.MAX_SAFE_INTEGER + 1の間の_すべて_の数値は表せます。
JavaScriptにはいくつかの特殊な数値があります。
NaNとInfinityです。+0と-0です。エラー値NaN(「Not a Number」の略、すなわち非数)は、次のような場合に生成されます。
Number('123'); // => 123
Number('Hello, World!'); // => NaN
Math.sqrt(-64); // => NaN
NaN + 69; // => NaN
NaNは自分自身と等しくない唯一の値です。
NaN === NaN; // => false
ある値がNaNかどうかを確認したい場合は、グローバル関数isNaN()を使う必要があります。
isNaN(NaN); // => true
isNaN(123); // => false
Infinityは、2つの問題のうちの1つを示すエラー値です。
Math.pow(2, 1024); // => Infinity
6 / 0; // => Infinity
-6 / 0; // => -Infinity
Infinityは(NaNを除いて)他のどの数値よりも大きくなります。同様に、-Infinityは(NaNを除いて)他のどの数値よりも小さくなります。
グローバル関数isFinite()を使うと、ある値が実際の数値かどうか(無限でもNaNでもないか)を確認できます。
isFinite(80085); // => true
isFinite(Infinity); // => false
isFinite(NaN); // => false
+0と-0はJavaScriptでは別々の数値です。これらは、0と区別がつかないほど小さな数値を表したときに生成されることがあります。符号付きゼロを使うと、「どちらの方向から」ゼロに近づいたかを記録できます。つまり、その数値がゼロとみなされる前にどの符号だったかということです。ゼロは1つしかないものとして扱うのが最善です。
数値は、同じ値であれば等しいとみなされます。
1 == 1.0;
// => true
1 === 1.0;
// => true
// Remember, all numbers are floating-points, so this is
// different syntax for the exact same value.
1 === 1n;
// => false
// Strictly checking a number against a bigint will always result
// in false.
JavaScriptにおける比較全般と数値の比較については、比較を参照してください。
JavaScriptの数値は浮動小数点数なので、これらの値を使った計算はすべて浮動小数点演算になります。したがって、JavaScriptでは次のようになります。
0.1 + 0.2 === 0.3;
// => false
簡潔な説明は0.30000000000000004.comを、詳細な説明はOracleのNumerical Computation Guide「What Every Computer Scientist Should Know About Floating-Point Arithmetic」の付録Dを参照してください。