1. Number型とは?
JavaScriptのNumber型は、IEEE 754倍精度浮動小数点数(64ビット)で表現されます。つまり、整数も小数も同じ型で扱われ、他の言語のように int や float といった区別はありません。
• 範囲:およそ ±1.79×10^308
• 精度:53ビット(約15〜16桁の精度)
イティセル/コード専門官簡単にいうと、JavaScriptでは「数値をどう保存し、どう演算するか」を国際規格(IEEE 754)に従って統一しています。
そのため、すべての数値は1つの型(Number)にまとめられ、浮動小数点数として扱われるのです。
イメージとしては「JavaScriptの数値は全部ひとつの箱に入っていて、その箱のルールがIEEE 754」という感じです。
「範囲:±1.79×10^308」ってどういうこと?
これは「JavaScriptで扱える最大・最小の数値の大きさ」です。
• 最大値:Number.MAX_VALUE ≈ 1.7976931348623157e+308
• 最小の正の値:Number.MIN_VALUE ≈ 5e-324



つまり、めちゃくちゃ大きい数も、めちゃくちゃ小さい数も扱えるけど、精度には限界があるということ。その精度が「約15〜16桁」までです。
console.log(999999999999999); → OK(15桁)
console.log(9999999999999999); → 精度が崩れる(16桁超え)


16桁を超えると、JavaScriptは内部で丸め処理を行うため、意図しない値になることがあります。
2. Number型の基本的な値





JavaScriptでは整数も小数も指数表記もすべて Number型 で扱われます。
整数(`int`)
let int = 42;小数(`float`)
let float = 3.14;指数表記(`exp`)
let exp = 1.2e3;3. 特殊な値





NaN(Not-a-Number)は、数値演算が失敗したときに返る「数値ではない値」です。
Number型は数値を扱うための型なので、例えば "abc" のような文字列を数値に変換しようとすると NaN になります。
Number("abc");


NaN
実行結果
NaN


Infinityは、「無限大」です。1 / 0 のようにゼロで割ったときや、数値が扱える範囲を超えたときに返されます。
-Infinity はその逆で「負の無限大」を意味します。
console.log(1 / 0);
console.log(-1 / 0);


Infinity
-Infinity
実行結果
Infinity
-Infinity-0について
JavaScriptのNumber型は IEEE 754倍精度浮動小数点数 で表現されており、この規格では「正のゼロ」と「負のゼロ」を区別します。
• 0 → 正のゼロ
• -0 → 負のゼロ



数学的にはどちらも同じ「0」ですが、コンピュータの世界では「計算の向き」や「符号の情報」を残すために区別されています。
let a = 0;
let b = -0;
console.log(a === b);


=== では区別されません。
実行してみると…ぽちっ



true
実行結果
true →同じと判定される


でも、Object.is() を使うと違いがわかります。
実行してみると…ぽちっ
console.log(Object.is(0, -0));


false
実行結果
false →違うと判定される


つまり「-0」は、ふだんは気にしなくてもいいけど、JavaScriptの数値の世界には実は隠れキャラがいる、くらいに覚えておくとちょうどいいです。
4. Numberに関する便利な定数


JavaScriptは Number オブジェクトに便利な定数を持っています。
• Number.MAX_VALUE:最大値



Number.MAX_VALUEは、JavaScriptで表現できる最大値です。
1.7976931348623157e+308までで、これを超えると `Infinity` になります。
わかりやすくいうと、無量大数をはるかに超え、不可説不可説転すら超える規模。
(整数で書くとブログがパンクするのでやめておきます)
• Number.MIN_VALUE:最小の正の値



Number.MIN_VALUEは、JavaScriptで表現できる最小の正の値。要するに0に最も近い正の数です。
• Number.MAX_SAFE_INTEGER:安全に表現できる最大整数(2^53 – 1)



Number.MAX_SAFE_INTEGERは、安全に表現できる最大の整数です。これを超えると整数の精度が保証されません。
• Number.MIN_SAFE_INTEGER:安全に表現できる最小整数(-(2^53 – 1))



Number.MIN_SAFE_INTEGERは、安全に表現できる最小の整数です。これ以下に行くと整数の精度が保証されません。
• Number.NaN



「Not-a-Number」を表す特殊値。数値変換に失敗したときなどに返されます。
• Number.POSITIVE_INFINITY / Number.NEGATIVE_INFINITY



「正の無限大」はNumber.POSITIVE_INFINITY
「負の無限大」はNumber.NEGATIVE_INFINITY
5. Numberのメソッド


Number.isNaN(value)



Number.isNaN(value) は、値が NaN かどうかを判定します。
結果が true なら「NaN」であることが確定。
結果が false なら「数値として扱える値」です。
Number.isNaN(NaN);
Number.isNaN("abc");


true
false
実行結果
true
falseNumber.isFinite(value)



Number.isFinite(value) は、値が有限の数値かどうかを判定します。
結果が true なら 有限の数値
結果が false なら NaN、-Infinity、Infinity、または数値以外
Number.isFinite(10);
Number.isFinite(Infinity);
Number.isFinite(NaN);


true
false
false
実行結果
true
false
falseNumber.isInteger(value)



Number.isInteger(value) は、値が整数かどうかを判定します。
整数なら true
整数でなければ false を返します(小数や文字列などは false)。
Number.isInteger(10);
Number.isInteger(10.5);


true
false
実行結果
true
falseNumber.isSafeInteger(value)



Number.isSafeInteger(value) は、その値が「安全に表現できる整数」かどうかを判定します。
安全な範囲は -(2^53 – 1) ~ 2^53 – 1(つまり -9007199254740991 ~ 9007199254740991)です。
この範囲内なら true、範囲を超えると false を返します
Number.isSafeInteger(9007199254740991);
Number.isSafeInteger(9007199254740992);


true
false
実行結果
true
falseNumber.parseInt(string) / Number.parseFloat(string)



Number.parseInt(string) / Number.parseFloat(string) は、文字列を数値に変換します。
parseInt は文字列(数字)を整数に変換します(小数点以下は切り捨て)。
parseFloat は小数も含めて変換します。
Number.parseInt("123");
Number.parseInt("123.45");
Number.parseFloat("123.45");


123
123
123.45
実行結果
123
123
123.456. 型変換と暗黙的キャスト





演算子の種類によって、文字列が数値に変換されたり、逆に数値が文字列に変換されたりするため、思わぬ結果になることがあります。
要するに、「足し算のつもりが文字列の結合になってしまう」こともあるのです。
`*` や `-` などの算術演算子は、文字列を数値に変換してから計算します。
`+` は特別で、数値の加算と文字列の結合の両方に使われるため、片方が文字列なら文字列結合が優先されます。
"5" * 2; →(文字列 "5" が数値に変換される)
"5" + 2; →(数値 2 が文字列に変換されて結合される)


10
“52”
実行結果
10
"52"7. BigIntとの違い


ES2020で導入された BigInt は、任意精度の整数を扱えます。
・Number は浮動小数点数、BigInt は整数専用
・Number の安全整数範囲(-(2^53 – 1) ~ 2^53 – 1)を超える値は BigInt で扱う



例えば、123456789012345678901234567890 のような大きな整数に末尾の `n` を付けるとBigInt 型になります。



普通の Number 型は 53ビット(約15〜16桁)までしか整数を正確に表現できないので、それ以上の桁数になると誤差が出ます。
console.log(9007199254740991 + 1);
console.log(9007199254740991 + 2);


9007199254740992
9007199254740992
実行結果
9007199254740992
9007199254740992 ← 本当は 9007199254740993 になるはず


BigInt 型を導入すると、JavaScript で「Number 型では正確に扱えない大きな整数」も誤差なく計算できるようになります。
console.log(9007199254740991n + 1n);
console.log(9007199254740991n + 2n);


9007199254740992n
9007199254740993n
実行結果
9007199254740992n
9007199254740993n ← 正しく計算できる8. よくある落とし穴


浮動小数点の誤差



JavaScript の Number 型は IEEE 754 倍精度浮動小数点数で表現されています。
この方式では2進数で正確に表せない小数(0.1 や 0.2 など)は「近似値」として保存されるため、計算結果に誤差が出ます。
要するに、JavaScript は 0.1 を正確に覚えられず、「0.10000000000000001」のような近い値に丸めて扱っているのです。
実行してみると…ぽちっ
console.log(0.1 + 0.2);


0.30000000000000004
実行結果
0.30000000000000004回避方法
◦ 整数に変換して計算する
◦ 誤差を吸収するライブラリ(decimal.js など)を利用する
NaNの比較



NaN は「Not-a-Number(数値ではない)」を表す特別な値です。
IEEE 754 の規格に従い、NaN は 自分自身とも等しくないという性質を持っています。
そのため、`NaN === NaN` は常に false になります。
NaN === NaN;


false
実行結果
false


NaN かどうかを判定したい場合は、Number.isNaN() を使います。
Number.isNaN(NaN);
Number.isNaN("abc");


true
false
実行結果
true
falseまとめ


JavaScript の数値型は、一見シンプルに見えて実はとてもクセの強い仕組みを持っています。
すべての数値が Number 型(IEEE 754 倍精度浮動小数点数)で表現されるため、整数も小数も同じ「箱」に入ります。その結果、範囲は天文学的に広い一方で、精度は約 15〜16 桁に限られ、浮動小数点特有の誤差や丸めが避けられません。
さらに、NaN や Infinity、-0 といった特殊な値が存在し、直感に反する挙動を示すこともあります。NaN === NaN が false になるのはその代表例です。また、演算子の挙動にも注意が必要で、+ は数値の加算と文字列の結合を兼ねる「二刀流」として振る舞います。
ES2020 で導入された BigInt は、こうした Number 型の限界を補う存在です。安全整数範囲を超える巨大な整数も正確に扱えるようになり、Number 型と並んで JavaScript の数値表現を支えるもう一つの柱となりました。
結局のところ、JavaScript の数値を正しく扱うには「範囲」「精度」「特殊値」「型変換」「BigInt」といった要素を理解しておくことが不可欠です。
「JavaScript の数値はクセが強い」――この事実を知っておくだけで、思わぬバグを避け、より堅牢なコードを書けるようになるでしょう。
もしこの記事が役に立ったと思ったら、シェアやコメントで教えてください。 いただいた声を今後の改善に活かしていきます。最後まで読んでくださり、本当にありがとうございました。









コメント