MENU

JavaScriptのプリミティブ型「Number」を徹底解説:仕様・特殊値・落とし穴まで完全ガイド【リメイク】

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. 特殊な値

Number型には「普通の数値」以外に、NaN / Infinity / -0 といった特殊な値が存在します。

イティセル/コード専門官

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

Number("abc");
リクナ / JavaScript統括官

NaN

実行結果
NaN
イティセル/コード専門官

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

console.log(1 / 0);
console.log(-1 / 0);
リクナ / JavaScript統括官

Infinity
-Infinity

実行結果
Infinity
-Infinity

-0について

JavaScriptのNumber型は IEEE 754倍精度浮動小数点数 で表現されており、この規格では「正のゼロ」と「負のゼロ」を区別します。

•  0 → 正のゼロ

•  -0 → 負のゼロ

イティセル/コード専門官

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

let a = 0;
let b = -0;
console.log(a === b);
イティセル/コード専門官

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

リクナ / JavaScript統括官

true

実行結果
true →同じと判定される
イティセル/コード専門官

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

console.log(Object.is(0, -0));
リクナ / JavaScript統括官

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");
リクナ / JavaScript統括官

true
false

実行結果
true
false

Number.isFinite(value)

イティセル/コード専門官

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

Number.isFinite(10);
Number.isFinite(Infinity);
Number.isFinite(NaN);
リクナ / JavaScript統括官

true
false
false

実行結果
true
false
false

Number.isInteger(value)

イティセル/コード専門官

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

Number.isInteger(10);
Number.isInteger(10.5);
リクナ / JavaScript統括官

true
false

実行結果
true
false

Number.isSafeInteger(value)

イティセル/コード専門官

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

Number.isSafeInteger(9007199254740991);
Number.isSafeInteger(9007199254740992);
リクナ / JavaScript統括官

true
false

実行結果
true
false

Number.parseInt(string) / Number.parseFloat(string)

イティセル/コード専門官

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

Number.parseInt("123");
Number.parseInt("123.45");
Number.parseFloat("123.45");
リクナ / JavaScript統括官

123
123
123.45

実行結果
123
123
123.45

6. 型変換と暗黙的キャスト

JavaScriptは柔軟な型変換を行うため、意図しない挙動に注意が必要です。

イティセル/コード専門官

演算子の種類によって、文字列が数値に変換されたり、逆に数値が文字列に変換されたりするため、思わぬ結果になることがあります。  
要するに、「足し算のつもりが文字列の結合になってしまう」こともあるのです。

`*` や `-` などの算術演算子は、文字列を数値に変換してから計算します。  
`+` は特別で、数値の加算と文字列の結合の両方に使われるため、片方が文字列なら文字列結合が優先されます。  

"5" * 2; →(文字列 "5" が数値に変換される
"5" + 2; →(数値 2 が文字列に変換されて結合される
リクナ / JavaScript統括官

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);
リクナ / JavaScript統括官

9007199254740992
9007199254740992

実行結果
9007199254740992
9007199254740992本当は 9007199254740993 になるはず
イティセル/コード専門官

BigInt 型を導入すると、JavaScript で「Number 型では正確に扱えない大きな整数」も誤差なく計算できるようになります。 

console.log(9007199254740991n + 1n);
console.log(9007199254740991n + 2n);
リクナ / JavaScript統括官

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);
リクナ / JavaScript統括官

0.30000000000000004

実行結果
0.30000000000000004

回避方法
  ⁠◦  整数に変換して計算する

  ⁠◦  誤差を吸収するライブラリ(decimal.js など)を利用する

NaNの比較

イティセル/コード専門官

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

NaN === NaN;
リクナ / JavaScript統括官

false

実行結果
false
イティセル/コード専門官

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

Number.isNaN(NaN);
Number.isNaN("abc");
リクナ / JavaScript統括官

true
false

実行結果
true
false

まとめ

JavaScript の数値型は、一見シンプルに見えて実はとてもクセの強い仕組みを持っています。  

すべての数値が Number 型(IEEE 754 倍精度浮動小数点数)で表現されるため、整数も小数も同じ「箱」に入ります。その結果、範囲は天文学的に広い一方で、精度は約 15〜16 桁に限られ、浮動小数点特有の誤差や丸めが避けられません。

さらに、NaN や Infinity、-0 といった特殊な値が存在し、直感に反する挙動を示すこともあります。NaN === NaN が false になるのはその代表例です。また、演算子の挙動にも注意が必要で、+ は数値の加算と文字列の結合を兼ねる「二刀流」として振る舞います。

ES2020 で導入された BigInt は、こうした Number 型の限界を補う存在です。安全整数範囲を超える巨大な整数も正確に扱えるようになり、Number 型と並んで JavaScript の数値表現を支えるもう一つの柱となりました。

結局のところ、JavaScript の数値を正しく扱うには「範囲」「精度」「特殊値」「型変換」「BigInt」といった要素を理解しておくことが不可欠です。  

「JavaScript の数値はクセが強い」――この事実を知っておくだけで、思わぬバグを避け、より堅牢なコードを書けるようになるでしょう。

もしこの記事が役に立ったと思ったら、シェアやコメントで教えてください。 いただいた声を今後の改善に活かしていきます。最後まで読んでくださり、本当にありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITTIのアバター ITTI 運営長

私はフロントエンドエンジニアを目指す初心者で、ITパスポートを取得済みです。現在はCopilotを活用しながらAIや最新のIT技術を学び、日本の開発現場で求められるチーム開発やセキュリティの知識を吸収しています。学んだことはコードや仕組みを整理し、わかりやすく発信することで、同じ学びの途中にいる人たちの力になりたいと考えています。

コメント

コメントする

目次