JavaScript | Numberオブジェクト

javascrpit JavaScript
スポンサーリンク

1. まず「Numberって何?」

  • JavaScript の数値は プリミティブ(基本型) です。普通に let x = 10; のように使います。
  • でも Number は「数値を包むオブジェクト(ラッパー)」を作るためのものです。new Number(10) とすると object になります。
  • 実際は ほとんどの場合 new を使わずにプリミティブのままNumber() や数値リテラル)で扱います。オブジェクト化すると挙動が変わるので注意。

2. プリミティブ vs Numberオブジェクト(例)

let a = 10;                // プリミティブ number
let b = new Number(10);    // Number オブジェクト

console.log(typeof a);     // "number"
console.log(typeof b);     // "object"

console.log(a == b);       // true  (== は自動で b をプリミティブに変換して比較)
console.log(a === b);      // false (型が違うので厳密比較は false)
JavaScript

ポイント

Number()(関数呼び出し)はプリミティブ数値を返し、new Number() はオブジェクトを返します。たとえば Number("123")123new Number("123")Number {123}

3. よく使うメソッド(実例)

  • valueOf():Numberオブジェクトの中のプリミティブ値を取り出す
let obj = new Number(10);
console.log(obj.valueOf()); // 10
JavaScript
  • toString():文字列に変換
  • toFixed(digits):小数点以下の桁数を指定して文字列で返す(四捨五入)
let n = 123.456;
console.log(n.toFixed(2)); // "123.46"
JavaScript
  • toExponential() / toPrecision() も有用(科学表記や有効桁数指定)。

補足:プリミティブの数値に対しても n.toFixed(...) のように呼べます。これは JS が一時的にラッパー(Numberオブジェクト)を裏で作る(自動ボクシング)ためです。

4. 重要な定数(Number の静的プロパティ)

  • Number.MAX_SAFE_INTEGER:安全に扱える最大の整数(= 253−12^{53} – 1253−1)
    計算:まず 253=90071992547409922^{53} = 9007199254740992253=9007199254740992、よって MAX_SAFE_INTEGER = 2^53 - 1 = 9007199254740991
Number.MAX_SAFE_INTEGER === 9007199254740991 // true
JavaScript
  • Number.MIN_SAFE_INTEGER-9007199254740991
  • Number.MAX_VALUE:表現できる最大の正の数(約 1.7976931348623157e+308
  • Number.MIN_VALUE:表現できる最小の正の数(0 に最も近い正の値、約 5e-324
  • Number.NaNNumber.POSITIVE_INFINITYNumber.NEGATIVE_INFINITY

なぜ「安全な整数」が必要?
JavaScript の数値は IEEE-754 の倍精度浮動小数点で表現されます。この形式だと、整数でもある範囲(±(2^53−1))を超えると正確に表現できないため、誤差や思わぬ結果が出ます。

例(浮動小数点と丸めの問題):

console.log(0.1 + 0.2); // 0.30000000000000004(0.3 にならない)
JavaScript

5. よくある落とし穴(初心者がつまずくポイント)

  • new Number(10) === 10false(型が違う)
    → ほとんどのケースで new Number を使う必要はありません。
  • NaN の扱い:typeof NaN"number" になります(これが混乱の元)。
    • isNaN("hello")true(非数に変換して判定するため)
    • Number.isNaN("hello")false(引数をそのまま判定)
      よって 厳密に NaN を判定するなら Number.isNaN() を使う
  • 浮動小数点誤差(例:0.1 + 0.2)と安全な整数の超過(Number.isSafeInteger() で判定可能)。
  • Infinity に注意。非常に大きな数を扱うと Infinity になります:
console.log(Number.MAX_VALUE * 2); // Infinity
JavaScript

6. 判定系ユーティリティ(よく使うもの)

  • Number.isNaN(value):値が厳密に NaN
  • Number.isFinite(value):値が有限か(Infinity / -Infinity ではない)
  • Number.isInteger(value):整数か
  • Number.isSafeInteger(value):安全な整数か(先ほどの ±9007199254740991 の範囲内か)

7. 大きすぎる整数を扱いたい時

  • ES2020 以降は BigInt(例:123n)が使えます。安全な整数範囲を超える整数を正確に扱えます。
    ただし、BigIntNumber の間で直接計算はできません(1n + 2 はエラー)。用途に応じて使い分けてください。

8. 初心者向けの練習(3つ)

  1. 0.1 + 0.2 を実行して出力を確認し、toFixed(2) で切り捨て/丸めして比べてみる。
  2. Number.MAX_SAFE_INTEGER + 1Number.MAX_SAFE_INTEGER + 2 を比較してみる(Number.isSafeInteger(...) で判定)。
  3. Number("123abc")parseInt("123abc", 10) の違いを試す(どちらが数になるか)。

まとめ

  • 普段はただの number(プリミティブ)を使う。new Number() は滅多に必要ない。
  • Number は便利な定数とメソッドを持つ(MAX_SAFE_INTEGERtoFixed 等)。
  • 浮動小数点の丸め誤差と「安全な整数」の概念は必ず押さえる(2^53 - 1 = 9007199254740991)。
  • より大きな整数は BigInt を検討。
タイトルとURLをコピーしました