【ITニュース解説】Mastering JavaScript Numbers

2025年09月06日に「Dev.to」が公開したITニュース「Mastering JavaScript Numbers」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

JavaScriptの数値は整数も小数も同じnumber型で扱い、様々な進数で記述できる。InfinityやNaNといった特殊な値もあり、計算時の精度に注意が必要だ。BigIntで大きな整数も扱え、文字列からの変換メソッドも利用できる。

出典: Mastering JavaScript Numbers | Dev.to公開日:

ITニュース解説

JavaScriptでプログラムを書く上で、数値は最も基本的な要素の一つであり、様々な計算や処理で欠かせない存在である。この解説では、JavaScriptの数値がどのように扱われるのか、その基本的な概念から応用までを詳しく見ていく。

まず、JavaScriptにおける数値は「Number」という単一のデータ型として定義される。C言語やJavaなどの他のプログラミング言語では、整数と小数(浮動小数点数)が別の型として扱われることが多いが、JavaScriptでは両方ともNumber型として区別なく扱われるのが特徴である。例えば、let integer = 42;と書けば整数として、let float = 3.14;と書けば小数として扱われるが、これらはどちらもNumber型である。

数値をプログラム中に直接記述する際には、いくつかの表現方法がある。普段よく使うのは「10進数」で、let decimal = 123;のように記述する。しかし、コンピュータ内部では2進数が基本となるため、JavaScriptでも「2進数(0bまたは0Bで始まる)」、「8進数(0oまたは0Oで始まる)」、「16進数(0xまたは0Xで始まる)」という形式で数値を表現できる。例えば、0b111は10進数の7を、0o17は10進数の15を、0x1Fは10進数の31を表す。これらの異なる表記法は、特にビット操作を伴うプログラミングで役立つことがある。

JavaScriptの数値は、IEEE 754という国際標準に従って64ビットの浮動小数点形式で表現される。この形式によって、非常に大きな数から非常に小さな小数まで幅広い範囲の数値を扱えるようになるが、同時に精度には限界がある。JavaScriptが表現できる最大の数値はNumber.MAX_VALUEで、約1.8e+308(1.8の後に0が308個続くような巨大な数)である。また、0に最も近い正の数値はNumber.MIN_VALUEで、約5e-324(小数点以下に0が323個並んだ後に5が続くような非常に小さな数)である。これらの範囲を超える数値や0に近すぎる数値は、特別な値として扱われる。

JavaScriptには、通常の数値とは異なる特別な値がいくつか存在する。まず「Infinity」は正の無限大を表し、例えば1を0で割るような、数学的に定義できない大きな結果となる演算を行うとInfinityが返される。同様に、「-Infinity」は負の無限大を表す。そして、「NaN(Not a Number)」は「数値ではない」ことを意味する。これは、例えば文字列を数値で割るなど、数値として解釈できない不正な演算の結果として現れる。"hello" / 2という式を実行するとNaNが返される。

NaNには特に注意が必要で、他の数値と比較する際に特殊な振る舞いをする。NaNは自分自身と比較してもfalseとなる唯一の値である。つまり、NaN === NaNという比較はfalseを返す。そのため、ある値がNaNであるかどうかを正確に判定するには、Number.isNaN()という専用の関数を使う必要がある。Number.isNaN(a)は、変数aNaNであればtrueを返す。

浮動小数点数を使う上で避けられないのが「精度問題」である。JavaScriptの浮動小数点演算は、正確な結果を期待して計算すると、予期しない誤差を生じることがある。最もよく知られた例は0.1 + 0.2の計算結果で、通常なら0.3になるところが0.30000000000000004のような微妙な誤差を含む値になる。これは、2進数で小数を正確に表現できないことによるもので、金融計算など厳密な精度が求められる場面では注意が必要である。この問題を緩和する方法の一つに、toFixed()メソッドを使って指定した桁数に丸める方法がある。例えば、(0.1 + 0.2).toFixed(2)とすることで、結果を文字列として"0.30"に丸めることができる。ただし、toFixed()は結果を文字列として返すため、その後の数値計算には再度変換が必要となる。

数値を扱うための便利なメソッドもいくつか用意されている。「Number()関数」は、与えられた値を数値に変換しようと試みる。Number("123")123を返す一方、Number("abc")のように数値に変換できない場合はNaNを返す。「parseInt()」は文字列を整数に変換し、「parseFloat()」は文字列を浮動小数点数に変換する。これらは文字列の先頭から数値として解釈できる部分だけを変換する特性がある。例えば、parseInt("123abc")123を、parseFloat("12.34abc")12.34を返す。

数値を特定の形式で表示するためのメソッドとして、「toFixed()」と「toPrecision()」がある。toFixed(n)は数値を指定した小数点以下の桁数に丸めて文字列として返す。123.456.toFixed(2)"123.46"となる。toPrecision(n)は、数値の有効桁数を指定して文字列として返す。123.456.toPrecision(4)"123.5"となる。これらは、数値を整形して表示する際に非常に役立つ。

標準のNumber型では表現できないほどの巨大な整数を扱う必要がある場合、「BigInt」という新しいデータ型を利用できる。BigIntは、数値の最後にnを付けることで表現され、JavaScriptがもともと持っている64ビットの制限を超えて、任意精度の整数を扱うことが可能になる。1234567890123456789012345678901234567890nのように非常に長い整数も正確に扱える。

基本的な算術演算子も理解しておくべき点である。加算(+)、減算(-)、乗算(*)、除算(/)は一般的な計算に用いられる。剰余(%)は割り算の余りを求め、累乗(**)はべき乗計算を行う。例えば、10 % 31を返し、10 ** 31000を返す。

JavaScriptの数値には、いくつかの重要な特性がある。一つは「不変性」である。一度作成された数値は変更できず、数値を操作する際には常に新しい数値が生成される。例えば、let x = 10; x = x + 1;という操作は、xという変数に新しい値11を再代入しているのであり、元の10という数値自体が11に変わったわけではない。もう一つの特性は、JavaScriptの「動的型付け」のおかげで、数値が他のデータ型と組み合わされると、自動的に型変換が行われる場合があることである。特に文字列と数値を+演算子で結合しようとすると、数値が文字列に変換されて連結されることが多い。"Hello" + 123"Hello123"となる。

このように、JavaScriptの数値は単なる数字の羅列ではなく、その内部的な仕組みや特別な振る舞いを理解することが、より正確で堅牢なプログラムを作成するために不可欠である。基本的なデータ型としての特性、様々な表現方法、特殊な値の扱い方、浮動小数点演算の精度問題、そして便利なメソッドや新しいデータ型であるBigIntまで、これらの知識を身につけることで、JavaScriptでの開発能力を大きく向上させることができるだろう。

【ITニュース解説】Mastering JavaScript Numbers | いっしー@Webエンジニア