Math

この章では、JavaScriptで数学的な定数と関数を提供するビルトインオブジェクトであるMathについて学びます。

Mathオブジェクト

Mathオブジェクトはビルトインのグローバルオブジェクトですが、コンストラクタではありません。 つまりMathオブジェクトはインスタンスを作らず、 すべての定数や関数はMathオブジェクトの静的なプロパティやメソッドとして提供されています。 たとえば、Math.PIプロパティは円周率πをあらわす定数であり、Math.sinメソッドはラジアン値から正弦を計算する関数です。 次の例では、90度における正弦を計算しています。90度の正弦は1なので、sin90変数は1を返します。

const rad90 = Math.PI * 90 / 180;
const sin90 = Math.sin(rad90);
console.log(sin90); // => 1

三角関数をはじめとした多くの関数や定数がMathオブジェクトから提供されています。 この章ではそれらのうちよく使われるものについてユースケースを交えて紹介します。 網羅的な解説についてはMDNのリファレンスを参照してください。

乱数を生成する

Mathオブジェクトの主な用途のひとつは、Math.randomメソッドによる乱数の生成です。 Math.randomメソッドは、0以上1未満の範囲内で、疑似ランダムな浮動小数点数を返します。 乱数生成のシードには現在時刻が使われます。

for (let i = 0; i < 5; i++) {
    // 毎回ランダムな浮動小数点数を返す
    console.log(Math.random());
}

次の例では、Math.randomメソッドを使って、任意の範囲で乱数を生成しています。

// minからmaxまでの乱数を返す関数
function getRandom(min, max) {
    return Math.random() * (max - min) + min;
}
// 1以上5未満の浮動小数点数を返す
console.log(getRandom(1, 5));

数値の大小を比較する

Math.maxメソッドは引数として渡された複数の数値のうち、最大のものを返します。 同様に、Math.minメソッドは引数として渡された複数の数値のうち、最小のものを返します。

console.log(Math.max(1, 10)); // => 10
console.log(Math.min(1, 10)); // => 1

これらのメソッドは可変長の引数を取るため、任意の個数の数値を比較できます。 数値の配列の中から最大・最小の値を取り出す際には、...(spread構文)を使うと簡潔に記述できます。

const numbers = [1, 2, 3, 4, 5];
console.log(Math.max(...numbers)); // => 5
console.log(Math.min(...numbers)); // => 1

数値を整数にする

Mathオブジェクトには数値を整数に丸めるためのメソッドがいくつかあります。 代表的なものは、小数点以下を切り捨てるMath.floorメソッド、小数点以下を切り上げるMath.ceilメソッド、そして四捨五入をおこなうMath.roundメソッドです。

Math.floorメソッドは、引数として渡した数以下で最大の整数を返します。このような関数は底関数と呼ばれます。 正の数である1.31になりますが、負の数である-1.3はより小さい整数の-2に丸められます。

次のMath.ceilメソッドは、引数として渡した数以上で最小の整数を返します。このような関数は天井関数と呼ばれます。 正の数である1.32になりますが、負の数である-1.3はより大きい整数の-1に丸められます。

Math.roundメソッドは、一般的な四捨五入の処理をおこないます。 小数部分が0.5よりも小さな場合は切り捨てられ、それ以外は切り上げられます。

// 底関数
console.log(Math.floor(1.3)); // => 1
console.log(Math.floor(-1.3)); // => -2
// 天井関数
console.log(Math.ceil(1.3)); // => 2
console.log(Math.ceil(-1.3)); // => -1
// 四捨五入
console.log(Math.round(1.3)); // => 1
console.log(Math.round(1.6)); // => 2
console.log(Math.round(-1.3)); // => -1

また、Math.truncメソッドは、渡された数字の小数点以下を単純に切り落とした整数を返します。 そのため、引数が正の値の場合はMath.floorメソッドと同じになり、そうでない場合はMath.ceilメソッドと同じになります。

// 単純に小数部分を切り落とす
console.log(Math.trunc(1.3)); // => 1
console.log(Math.trunc(-1.3)); // => -1