JavaScript入門 Mathオブジェクト
アプリケーション開発で一般的に必要になる数学的な関数、JavaScript組込みのMathオブジェクトについて解説しています。(数値のフォーマット指定、固定小数点、指数表現、精度の指定、基数の指定、定数、代数関連の関数、対数関連の関数、疑似乱数発生、三角関数、双曲線関数)
JavaScriptには整数専用の型はなく、数値はすべてIEEE754の64ビット長の浮動小数点数として表されます。このためMathのほとんどの関数に関しては、すべて小数として表現されます。また、JavaScriptでは複素数はサポートされていません。
数値のフォーマット指定
数値を表す形式を指定したい場合があります。たとえば、2.0093ではなく2.01と表示したり、1949032ではなく、1,949,032と表示したい場合です。フォーマット指定のためのJavaScript組込みの機能は限られていますが、固定桁数の10進数、精度の指定、指数表現などには対応しています。また、2進数、8進数、16進数といった基数の異なる数の表示にも対応しています。数のフォーマットのメソッドはすべて、数値ではなく文字列を返します。
固定小数点数
小数点以下の桁数を指定したい場合は、「Number.prototype.toFixed」を使うことができます。
const x = 19.51;
console.log( x.toFixed(3) );
>19.510
console.log( x.toFixed(2) );
>19.51
console.log( x.toFixed(1) );
>19.5
console.log( x.toFixed(0) );
>20
指数表現
数を指数表現で表示したい場合は、「Number.prototype.toExponential」を使います。
const x = 3800.5;
console.log( x.toExponential(4) );
>3.800.5e+3
console.log( x.toExponential(3) );
>3.801e+3
console.log( x.toExponential(2) );
>3.80e+3
console.log( x.toExponential(1) );
>3.8e+3
console.log( x.toExponential(0) );
>4e+3
精度の指定
全体の桁数を指定した場合は、「Number.prototype.toPrecision」が使えます(少数の位置がどこにあtっても)。
const x = 1000;
console.log( x.toPrecision(5) );
>1000.0
console.log( x.toPrecision(4) );
>1000
console.log( x.toPrecision(3) );
>1.00e+3
console.log( x.toPrecision(2) );
>1.0e+3
console.log( x.toPrecision(1) );
>1e+3
x = 15.335;
console.log( x.toPrecision(6) );
>15.33350
console.log( x.toPrecision(5) );
>15.335
console.log( x.toPrecision(4) );
>15.34
console.log( x.toPrecision(3) );
>15.3
console.log( x.toPrecision(2) );
>15
console.log( x.toPrecision(1) );
>2e+1
基数の指定
数値の基数(2進数、8進数、16進数など)を指定して表示したい場合には、「Number.prototype.toString」の引数に指定します(2から36の範囲)。
const x = 12;
console.log( x.toString() );
>12
console.log( x.toString(10) ); //10進数
>12
console.log( x.toString(16) ); //16進数
>c
console.log( x.toString(8) ); //8進数
>14
console.log( x.toString(2) ); //2進数
>1100
定数
よく使われる重要な定数については、Mathオブジェクトのプロパティが利用できます。
基本的な定数
Math.E | 自然対数の底 ≒ 2.718 |
Math.PI | 円の円長の直径に対する比率(円周率)≒3.142 |
対数関連の定数
Math.LN2 | 2の自然対数 ≒ 0.693 |
Math.LN10 | 10の自然対数 ≒ 2.303 |
Math.LOG2E | 2を底とするMath.Eの対数 ≒ 1.443 |
Math.LOG10E | 10を底とするMath.Eの対数 ≒ 0.434 |
代数関連の定数
Math.SQRT1_2 | 1/2の平方根 ≒ 0.707 |
Math.SQRT2 | 2の平方根 ≒ 1.414 |
代数関連の関数
累乗
基本的な累乗の関数はMath.powですが、次に示すように平方根、立方根、eの累乗などの関数が用意されています。
Math.pow( x , y ) | 基数をべき乗した値を返します。 Math.pow(2,3) = 8 Math.pow(1.7,2.3) ≒ 3.39 |
Math.sqrt(x) | ある数の平方根を返します。 Math.sqrt(16) = 4 Math.sqrt(15.5) ≒ 3.94 |
Math.cbrt(x) | xの立方根を返します。 Math.cbrt(27) = 3 Math.cbrt(22) ≒ 2.8 |
Math.exp(x) | e のある数値のべき乗を返します。 Math.exp(1) ≒ 2.718 Math.exp(5.5) ≒ 244.7 |
Math.expml(x) | e のある数値のべき乗から 1 を引いた値を返します。 Math.expml(1) ≒ 1.718 Math.expml(5.5) ≒ 243.7 |
Math.hypot(x1, x2, …) | 引数の2乗の和の平方根 Math.hypot(3,4) = 5 Math.hypot(2.3.4)=5.39 |
対数関連の関数
基本的な自然対数の関数はMath.logです。言語によっては「log」が「10を底とする対数」、「ln」が「自然対数」を示すこともありますが、JavaScriptでは「log」は「自然対数」を指します。利便性向上のためにES2015ではMath.log10が導入されました。
Math.log(x) | xの自然対数 Math.log(Math.E) = 1 Math.log(17.5) ≒ 2.86 |
Math.log10(x) | 10を底とするxの対数 Math.log10(10) = 1 Math.log10(16.7) = 1.22 |
Math.log2(x) | 2を底とするxの対数 Math.log2(2) = 1 Math.log2(5) ≒ 2.32 |
Math.loglp(x) | 1+xの自然対数 Math.loglp( Math.E – 1 ) = 1 Math.loglp( 17.5 ) ≒ 2.92 |
その他の関数
次にあげるのは一般的な数値演算を行う様々な関数です。絶対値や上限値、下限値、数の符号、指定した引数のうちの最大値・最小値の取得などができます。
Math.abs(x) | xの絶対値 Math.abs(-5.5) = 5.5 Math.abs(5.5) = 5.5 |
Math.sign(x) | xの符号。xが負なら-1、xが正なら1、xが0なら0 Math.sign(-10.5) = -1 Math.sign(6.77) = 1 |
Math.ceil(x) | xの上限値。xより大きいか等しい最小の整数値 Math.ceil(2.2) = 3 Math.ceil(-3.8) = -3 |
Math.floor(x) | xの下限値。xより小さいか等しい最大の整数値 Math.floor(2.8) = 2 Math.floor(-3.2) = -4 |
Math.trunc(x) | xの整数部分(少数部分はすべて切り捨て) Math.trunc(7.7) = -7 Math.trunc(-5.8) = -5 |
Math.round(x) | xをもっとも近い整数に四捨五入 Math.round(7.2) = 7 Math.round(7.7) = 8 Math.round(-7.7) = -8 Math.round(-7.2) = -7 |
Math.min(x1,x2,…) | 最小の引数を返す Math.min(1, 2) = 1 Math.min(3, 0.5, 0.66) = 0.5 Math.min(3,0.5, -0.66) = -0.66 |
Math.max(x1,x2,…) | 最大の引数を返す Math.min(1, 2) = 2 Math.min(3, 0.5, 0.66) = 3 Math.min(-3,0.5, -0.66) = 0.5 |
疑似乱数発生
Math.randomは疑似乱数を生成し、0以上1未満の疑似乱数を返します。Math.randomは別の範囲の疑似乱数を生成するためのメソッドは提供していません。ほかの範囲の数を取得するための方法を次に示します。xとyは実数を、mとnは整数を表します。
- [0,1) :Math.random()
- [x,y) :x + (y-x)*Math.random()
- [m,n)の整数 :m + Math.floor( (n-m)*Math.random() )
- [m,n)の整数 :m + Math.floor( (n-m+1)*Math.random() )
三角関数
サイン、コサイン、タンジェント、そしてその逆関数がすべて用意されています。Mathのライブラリの三角関数には「度」ではなく「ラジアン」を指定します。
Math.sin(x) | xラジアンのサイン Math.sin(Math.PI/2) = 1 Math.sin(Math.PI/4) ≒ 0.707 |
Math.cos(x) | xラジアンのコサイン Math.cos(Math.PI) = -1 Math.cos(Math.PI/4) ≒ 0.707 |
Math.tan(x) | xラジアンのタンジェント Math.tan(Math.PI/4) ≒ 1 Math.tan(0) = 0 |
Math.asin(x) | xのアークサイン Math.asin(0) = 0 Math.asin(Math.SQRT1_2) ≒ 0.785 |
Math.acos(x) | xのアークコサイン Math.acos(0) ≒ 1.57 Math.acos(Math.SQRT1_2) ≒ 0.785 |
Math.atan(x) | xのアークタンジェント Math.atan(0) = 0 Math.atan(Math.SQRT1_2) ≒ 0.615 |
Math.atan2(y, x0) | x軸から座標(x,y)までの反時計回りの角度(ラジアン) Math.atan2(0, 1) = 0 Math.atan2(1, 1) ≒ 0.785 |
度を用いている場合は、ラジアンに変換する必要があります。計算は単純で、180で割りπを掛けます。度からラジアンに変換する関数とラジアンから度へ変換する関数を次に示します。
function deg2rad(d) { return d/180*Math.PI; }
function deg2rad(r) { return r/Math.PI*180; }
双曲線関数
Math.sinh(x) | xの双曲線正弦 Math.sinh(0) = 0 Math.sinh(1) = 1.18 |
Math.cosh(x) | xの双曲線余弦 Math.cosh(0) = 1 Math.cosh(1) = 1.54 |
Math.tanh(x) | xの双曲線正接 Math.tanh(0) = 0 Math.tanh(1) ≒ 0.762 |
Math.asinh(x) | xの逆双曲線正弦(arcsinh) Math.asinh(0) = 0 Math.asinh(1) ≒ 0.881 |
Math.acosh(x) | xの逆双曲線余弦(arccosh) Math.acosh(0) = Nan Math.acosh(1) = 0 |
Math.atanh(x) | xの逆双曲線正接(arctanh) Math.atanh(0) = 0 Math.atanh(1) = Infinity |