JavaScript

レシピ

数値

JavaScriptで数学の計算を実行する

Mathオブジェクトを使って数学の各種計算を実行する方法について解説します。

目次

JavaScriptで各種計算を実行する

JavaScriptは四則演算の他に、Mathオブジェクトを使った計算を実行することができます。
このオブジェクトはコンストラクタがないため、以下のようにプロパティやメソッドを直接呼び出して使用します。

コード例

// ラジアンを計算
var radian = angle * Math.PI / 180;

// 座標x、yを計算
var coordinate_y = r * Math.sin(radian);
var coordinate_x = r * Math.cos(radian);

Mathオブジェクトには以下のプロパティとメソッドが用意されています。

プロパティ

プロパティ名
Math.E自然対数の底(e)「2.718281828459045
Math.LN1010の自然対数「2.302585092994046
Math.LN22の自然対数「0.6931471805599453
Math.LOG10E10を底としたeの対数「0.4342944819032518
Math.LOG2E2を底としたeの対数「1.4426950408889634
Math.PI円周率「3.141592653589793
Math.SQRT1_21/2の平方根「0.7071067811865476
Math.SQRT22の平方根「1.4142135623730951

メソッド

メソッド名実行内容
Math.absメソッドパラメータに渡した数値の絶対値を取得
Math.acosメソッドパラメータに渡した数値のアークコサイン(ラジアン)を計算する
Math.acoshメソッドパラメータに渡した数値のハイパーボリックアークコサインを計算する
Math.asinメソッドパラメータに渡した数値のアークサイン(ラジアン)を計算する
Math.asinhメソッドパラメータに渡した数値のハイパーボリックアークサインを計算する
Math.atanメソッドパラメータに渡した角度のアークタンジェントを表す数値(ラジアン)を計算する
Math.atan2メソッドMath.atan2(y,x)に対して、点(0,0)から点(x,y)までの半直線と、X軸の正の平面(x,0)の角度を計算する
Math.atanhメソッドパラメータに渡した数値のハイパーボリックアークタンジェントを計算する
Math.cbrtメソッドパラメータに渡した数値の立方根を計算する
Math.ceilメソッドパラメータに渡した数値の小数点以下を切り上げした数値を取得する
Math.clz32メソッドパラメータに渡した数値の32ビットバイナリ表現における先頭からの「0」の数を取得する
Math.cosメソッドパラメータに渡した数値のコサイン(余弦)を計算する
Math.coshメソッドパラメータに渡した数値のハイパーボリックコサインを計算する
Math.expメソッド自然対数の底であるネイピア数(オイラー数)に対して、パラメータで渡した数値で累乗した値を取得する
Math.expm1メソッド自然対数の底であるネイピア数(オイラー数)に対して、パラメータで渡した数値で累乗した後に「-1」した値を取得する
Math.floorメソッドパラメータに渡した数値の小数点以下を切り捨てした数値を取得する
Math.froundメソッドパラメータに渡した数値に最も近い浮動少数点数を取得する
Math.hypotメソッドパラメータに渡した数値の2乗和の平方根を計算する。パラメータには任意の数の数値を指定できる
Math.imulメソッドパラメータに渡した2つの数値の32ビット乗算を実行する
Math.logメソッドパラメータに渡した数値の自然対数(log)を計算する
Math.log10メソッドパラメータに渡した数値について、10を底とする対数を計算する
Math.log1pメソッドパラメータに渡した数値に1を加えた数値の自然対数(log)を計算する
Math.log2メソッドパラメータに渡した数値について、2を底とする対数を計算する
Math.maxメソッドパラメータに渡した数値の中から最大値を取得する。パラメータは任意の数だけ指定できるが配列(Array)は不可。
Math.minメソッドパラメータに渡した数値の中から最小値を取得する。パラメータは任意の数だけ指定できるが配列(Array)は不可。
Math.powメソッドパラメータに渡した数値の累乗を計算する。第1パラメータに数値、第2パラメータに累乗回数の数値を指定する。
Math.randomメソッド0以上〜1未満の範囲で浮動小数点数の乱数を取得する
Math.roundメソッドパラメータに渡した数値の小数点以下を四捨五入した数値を取得する
Math.signメソッドパラメータに渡した数値が「正」か「負」を判定する
Math.sinメソッドパラメータに渡した数値のサイン(正弦)を計算する
Math.sinhメソッドパラメータに渡した数値のハイパーボリックサインを計算する
Math.sqrtメソッドパラメータに渡した数値の平方根を計算する
Math.tanメソッドパラメータに渡した角度のタンジェントを表す数値(ラジアン)を計算する
Math.tanhメソッドパラメータに渡した数値のハイパーボリックタンジェントを計算する
Math.truncメソッド小数点以下を取り除いて整数にする

以降はMathオブジェクトのプロパティとメソッドを使った計算例を解説していきます。

絶対値を取得

数値の絶対値を取得するときはMath.absメソッドを使います。
数値から符号を取った値を取得します。
パラメータに文字列(String)の数字を渡した場合も、数値に変換して絶対値を取得することができます。

コード例

console.log(Math.abs(-100)); // 100
console.log(Math.abs(5)); // 5
console.log(Math.abs(-0.001)); // 0.001
console.log(Math.abs('-8')); // 8

累乗を計算

数値の累乗を計算するときはMath.powメソッドを使います。
第1パラメータに数値、第2パラメータに累乗する回数を指定します。

コード例

console.log(Math.pow(10,3)); // 1000 (10 * 10 * 10)
console.log(Math.pow(5,4)); // 625 (5 * 5 * 5 * 5)
console.log(Math.pow(-2,5)); // -32 (-2 * -2 * -2 * -2 * -2)
console.log(Math.pow(2,-2)); // 0.03125 (1 / 4)

数値符号を取得

数値の「正」「負」の符号を取得するときはMath.signメソッドを使います。

パラメータに渡した数値が「正」であれば1、「負」であれば-1、数値が「0」のときは0を返します。
また、数字の文字列(String)を渡したときは、数値に変換して符号を返します。

コード例

console.log(Math.sign(1)); // 1
console.log(Math.sign(0)); // 0
console.log(Math.sign(-1)); // -1
console.log(Math.sign(40.5)); // 1
console.log(Math.sign(-2.5)); // -1
console.log(Math.sign('5')); // 1

四捨五入、切り捨て、切り上げ

数値の小数点以下を四捨五入するときは、必要に応じて以下の4種類のメソッドを使用することができます。

  • Math.round – 小数点以下を四捨五入
  • Math.floor – 小数点以下を切り捨てる
  • Math.ceil – 小数点以下を切り上げる
  • Math.trunc – 正の数値の場合は小数点以下を切り捨てて、負の値の場合は切り上げる

以下の例は浮動小数点数を持つ変数number1number5に対して、それぞれのメソッドを実行して得られた値をconsole.logメソッドで出力します。

コード例

var number1 = 1.25;
var number2 = 1.75;
var number3 = -1.25;
var number4 = -1.75;
var number5 = '5.75';

// 四捨五入
console.log(Math.round(number1)); // 1
console.log(Math.round(number2)); // 2
console.log(Math.round(number3)); // -1
console.log(Math.round(number4)); // -2
console.log(Math.round(number5)); // 6

// 切り捨て
console.log(Math.floor(number1)); // 1
console.log(Math.floor(number2)); // 1
console.log(Math.floor(number3)); // -2
console.log(Math.floor(number4)); // -2
console.log(Math.floor(number5)); // 5

// 切り上げ
console.log(Math.ceil(number1)); // 2
console.log(Math.ceil(number2)); // 2
console.log(Math.ceil(number3)); // -1
console.log(Math.ceil(number4)); // -1
console.log(Math.ceil(number5)); // 6

// 小数点以下を取り除いて整数にする
console.log(Math.trunc(number1)); // 1
console.log(Math.trunc(number2)); // 1
console.log(Math.trunc(number3)); // -1
console.log(Math.trunc(number4)); // -1
console.log(Math.trunc(number5)); // 5

小数点以下の指定した桁数を残す場合の計算方法については、別記事「四捨五入、切り捨て、切り上げ」を参照してください。

指定した数値に最も近い単精度の浮動少数点数を取得

Math.froundメソッドを使うと、パラメータに渡した数値に近い単精度の浮動小数点数を取得することができます。
文字列の数字を渡すと、数値(Number)に変換した戻り値が得られます。

コード例

console.log(Math.fround(1)); // 1
console.log(Math.fround(0)); // 0
console.log(Math.fround(5.2219)); // 5.22189998626709
console.log(Math.fround(NaN)); // NaN
console.log(Math.fround(Infinity)); // Infinity
console.log(Math.fround(-0.00215)); // -0.00215000007301569
console.log(Math.fround('3.14')); // 3.140000104904175

ランダムな数値(乱数)を取得

ランダムな数値が必要なときはMath.randomメソッドを実行すると得ることができます。
このメソッドは0以上〜1未満の浮動小数点数を返します。

以下の例はfor文を使ってMath.randomメソッドを10回実行し、取得した乱数を出力します。

コード例

for(var i=0; i<10; i++) {
	console.log(Math.random());
}
// 1:0.34413499586008345
// 2:0.5958244731234994
// 3:0.5217054211840673
// 4:0.4127891606859544
// 5:0.5956624096139826
// 6:0.9279884231528324
// 7:0.5806970453218685
// 8:0.8350118012081118
// 9:0.5224963150279476
// 10:0.8610373197259229

整数で09の範囲で乱数を取得するときは、以下のように取得した乱数に10を掛けて、さらに小数点以下をMath.floorメソッドで切り捨てます。

コード例

for(var i=0; i<10; i++) {
	var random_value = Math.floor(Math.random() * 10);
	console.log(random_value);
}
// 1:3
// 2:0
// 3:0
// 4:8
// 5:0
// 6:2
// 7:5
// 8:6
// 9:0
// 10:5

乱数の範囲を指定するときは、Math.randomメソッドで取得した乱数に対して、範囲の最大値と最小値を使った計算を実行します。
以下の例では乱数の最小値を変数minに、最大値を変数maxに指定して、2つの数値の範囲から乱数を取得します。

コード例

var min = 21;
var max = 28;

for(var i=0; i<10; i++) {
	var random_value = Math.floor(Math.random() * ((max + 1) - min) + min);
	console.log(random_value);
}
// 1:26
// 2:22
// 3:21
// 4:25
// 5:21
// 6:28
// 7:23
// 8:25
// 9:22
// 10:23

計算内容について詳しくは別記事「ランダムな数値を取得する」を参照してください。

最大値と最小値を取得

パラメータで渡した複数の数値から最大値を取得するときはMath.maxメソッド、最小値を取得するときはMath.minメソッドを使います。
パラメータには任意の数だけ数値を渡すことができます。

コード例

console.log(Math.max(2, 0.5, 8, -1, 4)); // 8
console.log(Math.min(2, 0.5, 8, -1, 4)); // -1

配列に入っている値から最大値、最小値を取得するときは分割代入「」を使うことができます。
以下の例では配列が入った変数number_arrayから、それぞれ最大値と最小値の要素を取り出して値を出力します。

コード例

var number_array = [ 19, 52, 30, 42, 72, 53];
console.log(Math.max(...number_array)); // 72
console.log(Math.min(...number_array)); // 19

平方根を計算

数値の平方根を計算するときはMath.sqrtメソッドを使います。

コード例

console.log(Math.sqrt(4)); // 2
console.log(Math.sqrt(100)); // 10
console.log(Math.sqrt(0)); // 0
console.log(Math.sqrt(-4)); // NaN
console.log(Math.sqrt(19)); // 4.358898943540674

2乗和の平方根を計算

数値の2乗和の平方根を計算するときはMath.hypotメソッドを使います。
パラメータに渡す数値は必要な数だけ指定することができます。

コード例

console.log(Math.hypot()); // 0
console.log(Math.hypot(4)); // 4
console.log(Math.hypot(1, 2)); // 2.23606797749979
console.log(Math.hypot(3, 4)); // 5
console.log(Math.hypot(1,2,3,4)); // 5.477225575051661
console.log(Math.hypot(0,100)); // 100
console.log(Math.hypot(10,100)); // 100.4987562112089

例えば、「Math.hypot(1, 2)」を実行すると、第1パラメータの「1」の2乗した値「1」と、第2パラメータの「2」を2乗した値「4」の和である「5」の平方根を計算します。
これは、「Math.sqrt(5)」を実行した結果と同じ値になります。

もしパラメータに渡した値が1つの場合は、絶対値を求めるMath.absメソッドを実行したときと同じ値が得られます。

立方根を計算

数値の立方根を計算するときはMath.cbrtメソッドを使います。

コード例

console.log(Math.cbrt(1)); // 1
console.log(Math.cbrt(64)); // 4
console.log(Math.cbrt(216)); // 6

自然対数(log)を計算

自然対数を計算するときはMath.logメソッドを使います。

その他、パラメータに1を加えた数値の自然対数を求めるMath.log1pメソッド10を底とする対数を計算するMath.log10メソッド2を底とする対数を計算するMath.log2メソッドを使うことができます。

コード例

// 自然対数(log)を計算
console.log(Math.log(1)); // 0
console.log(Math.log(0)); // -Infinity
console.log(Math.log(-1)); // NaN
console.log(Math.log(100)); // 4.605170185988092

// 1を加えた数値の自然対数を計算
console.log(Math.log1p(1)); // 0.6931471805599453
console.log(Math.log1p(0)); // 0
console.log(Math.log1p(-1)); // -Infinity
console.log(Math.log1p(99)); // 4.605170185988092

// 10を底とする対数を計算
console.log(Math.log10(1)); // 0
console.log(Math.log10(1000)); // 3
console.log(Math.log10(0.01)); // -2

// 2を底とする対数を計算
console.log(Math.log2(2)); // 1
console.log(Math.log2(8)); // 3
console.log(Math.log2(256)); // 8

指数関数を計算

Math.expメソッドを使うと、自然対数の底であるネイピア数(オイラー数)のx乗の数値を計算することができます。
xはパラメータで数値で渡します。

また、Math.expm1メソッドを使うと上記の計算した数値から「-1」した値を得ることができます。

コード例

console.log(Math.exp(0)); // 1
console.log(Math.exp(1)); // 2.718281828459045
console.log(Math.exp(2)); // 7.38905609893065
console.log(Math.exp(4)); // 54.598150033144236

// Math.exp(x)-1 を計算
console.log(Math.expm1(0)); // 0
console.log(Math.expm1(1)); // 1.718281828459045
console.log(Math.expm1(2)); // 6.38905609893065
console.log(Math.expm1(4)); // 53.598150033144236

三角関数(sin、cos、tan)に関する計算

三角関数に関する計算をするときはMath.sinメソッドMath.cosメソッドMath.tanメソッドを使うことができます。

以下の例では円の周囲上にある点のX座標(Math.cosメソッド)、Y座標(Math.sinメソッド)、タンジェントを表す数値(Math.tanメソッド)を計算します。
その後に計算したX座標とY座標を使って、点(0,0)から点(x,y)までの半直線と、X軸の正の平面(x,0)の角度をMath.atan2メソッドで計算します。

コード例

// 辺の長さ
var r = 100;

// 角度
var angle = 50;

// ラジアン
var radian = angle * Math.PI / 180;

// 点のX座標、Y座標、タンジェントの数値(ラジアン)を計算
var coordinate_y = r * Math.sin(radian);
var coordinate_x = r * Math.cos(radian);
var tan = Math.tan(radian);

// 点(0,0)から点(x,y)までの半直線と、X軸の正の平面(x,0)の角度を計算
var angle_a = Math.atan2( coordinate_y, coordinate_x) * 180 / Math.PI;

console.log(coordinate_y); // 76.60444431189781
console.log(coordinate_x); // 64.27876096865394
console.log(tan); // 1.19175359259421
console.log(angle_a); // 49.99999999999999

逆三角関数(Arcsin、Arccos、Arctan)に関する計算

逆三角関数に関する計算では、Arcsin(アークサイン)を計算するMath.asinメソッド、Arccos(アークコサイン)を計算するMath.acosメソッド、Arctan(アークタンジェント)を計算するMath.atanメソッドを使うことができます。

コード例

// Arcsin(アークサイン)
console.log(Math.asin(1.1)); // NaN
console.log(Math.asin(1)); // 1.5707963267948966
console.log(Math.asin(0.5)); // 0.5235987755982989
console.log(Math.asin(0)); // 0
console.log(Math.asin(-0.5)); // -0.5235987755982989
console.log(Math.asin(-1)); // -1.5707963267948966
console.log(Math.asin(-1.1)); // NaN

// Arccos(アークコサイン)
console.log(Math.acos(1.1)); // NaN
console.log(Math.acos(1)); // 0
console.log(Math.acos(0.5)); // 1.0471975511965979
console.log(Math.acos(0)); // 1.5707963267948966
console.log(Math.acos(-0.5)); // 2.0943951023931957
console.log(Math.acos(-1)); // 3.141592653589793
console.log(Math.acos(-1.1)); // NaN

// Arctan(アークタンジェント)
console.log(Math.atan(1)); // 0.7853981633974483
console.log(Math.atan(0.5)); // 0.4636476090008061
console.log(Math.atan(0.1)); // 0.09966865249116204
console.log(Math.atan(0)); // 0
console.log(Math.atan(-0.1)); // -0.09966865249116204
console.log(Math.atan(-0.5)); // -0.4636476090008061
console.log(Math.atan(-1)); // -0.7853981633974483

双曲線関数に関する計算

双曲線関数に関する計算では、ハイパーボリック サインを計算するMath.sinhメソッド、ハイパーボリック コサインを計算するMath.coshメソッド、ハイパーボリック タンジェントを計算するMath.tanhメソッドを使うことができます。

コード例

// ハイパーボリック サイン
console.log(Math.sinh(10)); // 11013.232874703393
console.log(Math.sinh(5)); // 74.20321057778875
console.log(Math.sinh(1)); // 1.1752011936438014
console.log(Math.sinh(0)); // 0
console.log(Math.sinh(-1)); // -1.1752011936438014
console.log(Math.sinh(-5)); // -74.20321057778875
console.log(Math.sinh(-10)); // -11013.232874703393

// ハイパーボリック コサイン
console.log(Math.cosh(10)); // 11013.232920103324
console.log(Math.cosh(5)); // 74.20994852478785
console.log(Math.cosh(1)); // 1.5430806348152437
console.log(Math.cosh(0)); // 1
console.log(Math.cosh(-1)); // 1.5430806348152437
console.log(Math.cosh(-5)); // 74.20994852478785
console.log(Math.cosh(-10)); // 11013.232920103324

// ハイパーボリック タンジェント
console.log(Math.tanh(10)); // 0.9999999958776927
console.log(Math.tanh(5)); // 0.9999092042625951
console.log(Math.tanh(1)); // 0.7615941559557649
console.log(Math.tanh(0)); // 0
console.log(Math.tanh(-1)); // -0.7615941559557649
console.log(Math.tanh(-5)); // -0.9999092042625951
console.log(Math.tanh(-10)); // -0.9999999958776927

双曲線の逆関数に関する計算

双曲線の逆関数に関する計算では、ハイパーボリック アークサインを計算するMath.asinhメソッド、ハイパーボリック アークコサインを計算するMath.acoshメソッド、ハイパーボリック アークタンジェントを計算するMath.atanhメソッドを使うことができます。

コード例

// ハイパーボリック アークサイン
console.log(Math.asinh(10)); // 2.99822295029797
console.log(Math.asinh(5)); // 2.3124383412727525
console.log(Math.asinh(1)); // 0.881373587019543
console.log(Math.asinh(0)); // 0
console.log(Math.asinh(-1)); // -0.881373587019543
console.log(Math.asinh(-5)); // -2.3124383412727525
console.log(Math.asinh(-10)); // -2.99822295029797

// ハイパーボリック アークコサイン
console.log(Math.acosh(10)); // 2.993222846126381
console.log(Math.acosh(5)); // 2.2924316695611777
console.log(Math.acosh(1)); // 0
console.log(Math.acosh(0)); // NaN

// ハイパーボリック アークタンジェント
console.log(Math.atanh(1.1)); // NaN
console.log(Math.atanh(1)); // Infinity
console.log(Math.atanh(0.9)); // 1.4722194895832204
console.log(Math.atanh(0.5)); // 0.5493061443340548
console.log(Math.atanh(0)); // 0
console.log(Math.atanh(-0.5)); // -0.5493061443340548
console.log(Math.atanh(-0.9)); // -1.4722194895832204
console.log(Math.atanh(-1)); // -Infinity
console.log(Math.atanh(-5)); // NaN

32ビットバイナリ数値の先頭から続く「0」の数を計算

Math.clz32メソッドを使うと、パラメータで渡した数値の32ビットバイナリ数値において、先頭(左端)から数値までの間にある「0」の数を取得することができます。

コード例

console.log(Math.clz32(0)); // 32
console.log(Math.clz32(-1)); // 0
console.log(Math.clz32(2)); // 30
console.log(Math.clz32(1000000)); // 12
console.log(Math.clz32(123456789)); // 5

32ビット高速乗算を実行

Math.imulメソッドを使うと、パラメータで渡す2つの数値(整数)に対して高速乗算を実行します。
もしパラメータに浮動小数点数を渡した場合は、小数点以下を切り捨てた整数に変換して乗算を実行します。

コード例

console.log(Math.imul(1,5)); // 5
console.log(Math.imul(2,4)); // 8
console.log(Math.imul(10,100)); // 1000
console.log(Math.imul(0xfff,1)); // 4095
console.log(Math.imul( 1.999, 7.999)); // 7

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。