JavaScriptのMathオブジェクトは、この言語における「静かなユーティリティベルト」のような存在です。インスタンス化する必要も、インポートする必要もありません。単にすべてのランタイムに存在し、ピクセル値の丸めからサイコロの乱数生成まで、あらゆる処理を行う準備ができています。Mathは静的オブジェクトであるため、すべてのメソッドとプロパティは名前空間に直接紐付いています。new Math().PIではなく、Math.PIと記述します。この設計上の選択によりシンプルさが保たれていますが、本番環境のロジックで利用する前に理解しておくべき「注意点」もいくつか存在します。

コンストラクタを持たない静的オブジェクト

ほとんどの組み込みJavaScriptオブジェクトは、インスタンスの作成を求めます。new Date()new Array()のように呼び出します。しかし、Mathはそれを拒否します。Mathは、プリミティブなNumber型に対して操作を行う、関連する関数と定数の名前空間として設計されています。Math.sqrt(16)を呼び出せば4が得られますが、newキーワードを使おうとするとエンジンはTypeErrorをスローします。このパターンによりメモリがクリーンに保たれ、Mathが純粋に関数的であることを示しています。入力を受け取り、出力を返し、何も変更(mutate)しません。

覚えておくべき厳格な制限が1つあります。Mathは標準的なIEEE 754数値で動作します。BigIntには対応していません。Math.round()Math.abs()BigIntを渡すと、TypeErrorが発生します。アプリケーションが64ビット整数以上を扱う場合は、値を変換するか、代わりにネイティブのBigInt演算子を使用して算術演算を行う必要があります。

実際に使用する定数

Mathオブジェクトは、マジックナンバー(直書きの数値)を避けるために役立つ、いくつかの数値定数を公開しています。

  • Math.PIは、おなじみの3.14159...で、円、三角関数、または度からラジアンへの変換など、あらゆる場面で不可欠です。
  • Math.Eはネイピア数(Euler's number)で、約2.718です。指数関数的な成長曲線、複利計算、対数スケールなどで登場します。
  • Math.SQRT2は2の平方根で、約1.414です。正方形の対角線が必要な場合や、単純な幾何学でベクトルを正規化したい場合に便利です。
  • Math.LN2は2の自然対数で、約0.693です。二分木、情報エントロピー、または底が2の対数を用いた計算量解析を扱うアルゴリズムで見かけるでしょう。

これらの値は完全に倍精度浮動小数点数です。これらはメソッドではなくプロパティであるため、括弧なしでアクセスします。

丸め、符号、絶対値

最も一般的なMathのタスクは、数値を整えることです。JavaScriptには4つの丸めメソッドがありますが、それらは全く同じ挙動をするわけではありません。特に正の範囲を外れた場合に顕著です。

Math.abs(x)は数値の絶対値(大きさ)を返します。-42を渡すと42が得られます。方向ではなく距離が重要な場合に便利です。タイムスタンプの比較、UIでのドラッグの差分計算、あるいは推測値が誤差範囲内にあるかどうかのチェックなどを考えてみてください。

Math.round(x)は、学校で習うような一般的な丸めです。最も近い整数に丸め、端数が0.5の場合は次の正の整数へと切り上げます。したがって、4.44になり、4.55になります。

Math.ceil(x)は、常に上の整数へと切り上げます。4.15になり、-4.9-4になります。この最後の方は、多くの人を驚かせます。数直線上で-4-4.9よりも大きいため、ceilは負の数の場合、ゼロに向かって移動します。

Math.floor(x)はその逆です。常に下の整数へと切り下げます。4.94になり、-4.1-5になります。検索結果のページネーションや、固定サイズのメモリブロックの割り当てを行う場合は、通常floorが適しています。

Math.trunc(x)は、小数部分を完全に削ぎ落とし、整数部分のみを残します。実質的に、符号に関係なくゼロに向かって移動します。4.94になり、-4.9-4になります。浮動小数点を切り捨てて整数にキャストする言語からロジックを移植する場合、これは非常に便利なメソッドです。

最後に、Math.sign(x)は、値がゼロのどちら側にあるかを教えてくれます。正の数には1、負の数には-1、正のゼロには0、負のゼロには-0、そして数値ではないものにはNaNを返します。if-elseの連鎖を書かずに、方向によって処理を分岐させる簡潔な方法です。

乱数の生成

Math.random()は、0(含む)から1(含まない)までの擬似乱数(浮動小数点数)を生成します。これは暗号学的に安全ではないため、パスワードの生成、トークンの作成、または金銭が絡むような処理には使用しないでください。