タイトル: Number
SEOタイトル: JavaScript Number オブジェクト完全ガイド(プロパティ / メソッド / 浮動小数点の注意 / BigInt)
| この記事の要点 |
- Number は JavaScript の数値プリミティブをラップするビルトインオブジェクト
- 内部表現はIEEE 754 倍精度浮動小数点 (64bit)。安全な整数範囲は
-(2^53-1) 〜 2^53-1 - 主要プロパティ:
Number.MAX_SAFE_INTEGER / EPSILON / POSITIVE_INFINITY / NaN - 主要メソッド:
toFixed() / toString() / toExponential() / Number.isInteger() / Number.isFinite() - 注意:
0.1 + 0.2 !== 0.3。比較は Math.abs(a-b) < Number.EPSILON を使う。整数を超える値は BigInt を使う
|
Number とは
Number は JavaScript の数値を扱うビルトインオブジェクトです。整数と小数の区別はなく、すべてIEEE 754 倍精度浮動小数点数 (64 bit)として保持されます。
数値リテラルの種類
// 10進
const a = 42;
const b = 3.14;
const c = 1.5e3; // 1500
// 2進 / 8進 / 16進
const bin = 0b1010; // 10
const oct = 0o755; // 493
const hex = 0xff; // 255
// 数値セパレータ (ES2021)
const big = 1_000_000; // 1000000
// BigInt (整数の上限超え)
const huge = 9007199254740993n;
主要なプロパティ
| プロパティ | 意味 | 値 |
Number.MAX_VALUE | 表現可能な最大正数 | ≈ 1.798e+308 |
Number.MIN_VALUE | 表現可能な最小正数 | ≈ 5e-324 |
Number.MAX_SAFE_INTEGER | 整数として安全な最大値 | 2^53 - 1 = 9007199254740991 |
Number.MIN_SAFE_INTEGER | 整数として安全な最小値 | -(2^53 - 1) |
Number.EPSILON | 1 と 1 より大きい次の値との差 | ≈ 2.22e-16 |
Number.POSITIVE_INFINITY | 正の無限大 | Infinity |
Number.NEGATIVE_INFINITY | 負の無限大 | -Infinity |
Number.NaN | 非数 | NaN |
主要な静的メソッド
Number.isInteger(42); // true
Number.isInteger(3.14); // false
Number.isFinite(1/0); // false (Infinity)
Number.isFinite(NaN); // false
Number.isNaN(NaN); // true
Number.isNaN("NaN"); // false (グローバル isNaN との違い)
Number.isSafeInteger(2**53); // false ← 安全範囲を超える
Number.parseInt("42px"); // 42
Number.parseFloat("3.14abc");// 3.14
インスタンスメソッド
const n = 12345.6789;
n.toFixed(2); // "12345.68"
n.toExponential(2); // "1.23e+4"
n.toPrecision(4); // "1.235e+4"
n.toString(); // "12345.6789"
n.toString(2); // 2進表現
n.toString(16); // 16進表現
n.toLocaleString('ja-JP'); // "12,345.679"
浮動小数点の落とし穴
0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3; // false ← よくあるバグ
// 安全な比較
const eq = (a, b) => Math.abs(a - b) < Number.EPSILON;
eq(0.1 + 0.2, 0.3); // true
// 通貨計算は整数(最小単位)で扱う
const yen = 100; // 100 円
const tax = Math.round(yen * 0.1); // 切り捨て / 切り上げを明示
整数範囲を超えるなら BigInt
Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true (!) 精度落ち
// BigInt は任意精度整数
9007199254740993n + 1n; // 9007199254740994n
// 注意: Number と BigInt の演算は不可
1n + 1; // TypeError
1n + BigInt(1); // 2n
文字列 → 数値変換
| 方法 | 例 | 備考 |
Number() | Number("42") // 42 | 非数値は NaN |
parseInt() | parseInt("42px") // 42 | 基数指定推奨: parseInt(s, 10) |
parseFloat() | parseFloat("3.14abc") // 3.14 | 先頭から読める分だけ |
+ (単項) | +"42" // 42 | 短いが意図が分かりにくい |
* 1 / - 0 | "42" * 1 // 42 | 非推奨 |
NaN の判定
NaN === NaN; // false ← 自分自身と等しくない唯一の値
isNaN("abc"); // true ← グローバル: 数値変換してから判定
Number.isNaN("abc"); // false ← 厳密: NaN 値かどうかだけ判定
Number.isNaN(NaN); // true
判定したいなら Number.isNaN() を使うのが安全です。