JavaScript/数値
数値(すうち、number)は数を表すプリミティブ値です。 Numberオブジェクトは数値プリミティブのラッパーオブジェクトです。
概要編集
JavaScriptでは数値を浮動小数点数でサポートされています(ここでは数値と長整数は別のものとして扱います)。 浮動小数点数とは、コンピュータで用いられる実数の近似で、IEEE 754の64ビット倍精度浮動小数点数が使われます。
数値リテラル編集
数値リテラル(Numeric literal)は次のような形をしています。
42
42.0 // 上と同じ値
-1
0
864e5
0xFFFF
864e5
というのは科学的表記法で ( )、すなわち86400000
に等しい数値です。
0xFFFF
というのは十六進法による表示で、十進法の65535
に等しい数値です。
JavaScriptにおいて0xFFFF
と65535
はまったく同じ数値です。
JavaScriptには二進法や八進法の整数リテラルはありませんでしたが、ECMA-262第6版で導入されました。
0b1101 // 13
0o3162 // 1650
二進法の整数リテラルは 0b
(あるいは0B
)を前置し、八進法の整数リテラルは0o
(あるいは0o
)を前置します[1]。
0
だけを前置する八進法の整数リテラルは過去にサポートされていましたがECMA-262第3版で削除されました。多くの処理系では後方互換のために依然として八進法の整数リテラルをサポートしていますが、非推奨とされ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の数値は IEEE 754 の64ビット倍精度浮動小数点数です。
64ビット倍精度浮動小数点数で精度が落ちることなく整数を表現できる最小値と最大値は、それぞれ Number.MIN_SAFE_INTEGER と Number.MAX_SAFE_INTEGER で提供されます。
typeof 演算子を数値に適用すると値に関係なく "number" を返します。
数値が(精度が失われているにしても)整数であるかは Number.isInteger(number)で、精度を失っていない整数であるかは Number.isSafeInteger(number) で調べることが出来ます。
ビット演算は64ビット倍精度浮動小数点数を32ビット符号付き整数に変換してから演算されます。
符号なし右シフト >>>
だけは趣が異なり -1>>>1 === 2147483647
と結果は正になります。
JavaScriptの数値の型 |
C言語の数値変数には、整数型(int)や浮動小数型(float)などといった型があります。 しかし JavaScript の数は倍精度の64ビットの浮動小数しかなく整数型は浮動小数の仮数部を使って表現されます。 これはプリミティブな「数値」の場合で、BigIntやTypedArrayは異なる内部構造を持っています。 |
数値の取り得る特殊な値編集
NaN編集
NaN(ナン、Not a Number、非数、ひすう)とは、数値に変換できない文字列を数値に変換しようとしたり、数値演算に不正なパラメータが与えられら事を表す特殊な値です。IEEE 754の NaN へのインターフェースで、グローバルオブジェクトの静的プロパティ NaN として参照できます。
Infinity編集
Infinity(インフィニティ、無限大、むげんだい)とは、典型的には演算結果がオーバーフローした時に取る値で、セロ除算でも生成されます。 IEEE 754の Infinity へのインターフェースで、グローバルオブジェクトの静的プロパティ Infinity として参照できます。
Numberオブジェクト編集
NumberオブジェクトはJavaScriptのプリミティブ型である数値型をラップします。Numberコンストラクタに数値として解釈できないオブジェクト(たとえば "A"
などの文字列)を渡すと、NaN
を返します。
var two = new Number(2);
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組み込みオブジェクトに追加されました。
|
桁数の多い数値編集
ECMAScript2021以降、数値の利用などの際に、アンダーバー _ を桁を見やすくするための記号として書けます。
- コード例
let a = 100_000; // 変数を宣言
console.log(a); // コンソールに出力
a = 100_000 + 4;
console.log(a);
- 実行結果
100000 100004
出力の際には、アンダーバーは無視されます。
2022年の時点では、最新のwebブラウザ画面上でも問題なく同機能が使えます。(Firefox 101 で確認ずみ.)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>test</title>
<script>
let a = 100_000; // 変数を宣言
document.write(a + "<br>");
a = 100_000 + 4;
document.write(a + "<br>" );
</script>
</head>
</html>
脚註編集
関連項目編集
- Math - 数学関数と定数