Java入門 / Java基本

【Java入門 実用編】数値のいろいろな取り扱い(1) | Math クラスの利用

2025.07.25

株式会社GSI ITエンジニア募集【成長をカタチに】

前回、前々回の記事では、Java の文字列について実用的な利用方法をご紹介しました。当記事からは、文字列に次いでプログラミングで最も利用頻度が高い「数値」を扱うための実践的な方法について、利用する主要なクラスやメソッド、具体的なコード例を交えながら説明します。

当記事ではその第一歩として、Javaで基本的な数学的計算や算術演算を行うための標準クラスである Math クラスに焦点を当て、代表的なメソッドと使い方についてご紹介します。

◆Java入門 記事一覧はこちら

java.lang.Math クラス

Math クラスとは

Mathクラスは、Javaにおいて基本的な数学的計算や算術演算を行うための幅広い機能が提供されているクラスです。具体的な例としては、小数点以下の処理、大小比較、絶対値の取得、さらには平方根や指数、対数、三角関数、乱数生成など、様々な機能をシンプルなメソッドで提供します。

java.lang.Math クラス - Java 21 APIドキュメント

Math クラスの利用

Math クラスは java の基本パッケージ(java.lang)のクラスであるため、使用時に import 宣言を行う必要はありません。

また、Math クラスのメソッドは静的メソッド(static メソッド)として準備されています。これにより Mathクラスのインスタンスを新しく生成することなく、クラス名を直接使って「Math.メソッド名()」という形式で呼び出すことで、手軽に数学関数を利用することが可能です。

java.lang.StrictMath クラスについて

Javaには、Math クラスと同じ機能を持ちながら、厳密な計算結果の保証を目的とした「java.lang.StrictMath」クラスが存在します。StrictMath クラスでは、Math クラスと同様のメソッド群が提供されており、2つのクラスの主な違いはその動作の「厳密性」にあります。

Math クラス:
処理が高速である反面、一部の算術演算の結果がJava仮想マシン(JVM)の実装に依存するため、ごくわずかながら環境によって誤差が生じる可能性があります。

StrictMath クラス:
IEEE 754標準に厳密に準拠しており、どのJava環境で実行しても常に同じ計算結果が返ってくることが保証されています。

このため、複数の環境で実行しても厳密に同じ結果が求められるようなケースでは StrictMath クラスの利用を検討するのが良いでしょう。

StrictMath クラス - Java 21 APIドキュメント

しかし、そもそもJavaの浮動小数点数(float や double)の処理自体には、わずかな丸め誤差が含まれることがあるため、ほとんどの一般的なアプリケーションでは Math クラスの利用で十分と言えます。

もしJavaで小数を厳密に扱いたい場合は、BigDecimal などのクラスを利用することができます。BigDecimal クラスの利用については、次回の記事で詳しくご説明します。

丸め処理(切り捨て・切り上げ・ラウンド)

Math クラスでは、小数点以下の切り捨て、切り上げ、丸め処理のためのメソッドがそれぞれ準備されています。

小数点以下の切り捨て(floor メソッド)

floor メソッドは、引数(double 型)で指定した小数値以下で最も近い double 型の整数値を返します。引数の値が負の値だった場合、整数値部分を返すのではなく、引数より値が小さい整数を返すことに注意してください。

Math.floor メソッド - Java 21 APIドキュメント

// 2.0 と出力される
System.out.println(Math.floor(2.999));

// -3.0 と出力される
System.out.println(Math.floor(-2.001));


ただし、引数が整数の値だった場合や、NaN、無限大、正のゼロ(0.0)、または負のゼロ(-0.0)の場合は、引数と同じ値が返されます。

// 1.0 と出力される
System.out.println(Math.floor(1));

// NaN と出力される
System.out.println(Math.floor(Double.NaN));

// -0.0 と出力される
System.out.println(Math.floor(-0.0));

小数点以下の切り上げ(ceil メソッド)

ceil メソッドは、引数(double 型)で指定した小数値以上で最も近い整数値を double 型で返します。

Math.ceil メソッド - Java 21 APIドキュメント

// 2.0 と出力される
System.out.println(Math.ceil(1.01));

// -10.0 と出力される
System.out.println(Math.ceil(-10.9));


floor メソッドと同様に、引数が整数の値だった場合や、NaN、無限大、正のゼロ(0.0)、または負のゼロ(-0.0)の場合は、引数と同じ値が返されます。ただし、引数が 0 より小さく -1 よりも大きい場合は、負のゼロ(-0.0)が返されることに注意してください。

// -1.0 と出力される
System.out.println(Math.ceil(-1));

// -Infinity と出力される
System.out.println(Math.ceil(Double.NEGATIVE_INFINITY));

// -0.0 と出力される(-0.0 の場合は同じ値を返却)
System.out.println(Math.ceil(-0.0));

// -0.0 と出力される(0 より小さく -1 よりも大きい場合は -0.0 を返却)
System.out.println(Math.ceil(-0.5));

最も近い整数値への丸め(round メソッド)

round メソッドは、引数(float 型 または double 型)に最も近い整数値(引数が float 型の場合は int 型、引数が double 型の場合は long 型)を返します。

Math.round メソッド - Java 21 APIドキュメント

ただし、ちょうど中間点にある場合(小数点以下がちょうど X.5 の場合)には、引数より大きい整数値を返します。これは引数が負の値でも同じです。また戻り値が整数なので、floor メソッドや ceil メソッドとは異なり、0 未満の引数に対し 0 が返される場合は通常のゼロである(負のゼロ -0.0 ではない)ことに注意が必要です。

また、round メソッドは四捨五入と似た動作となりますが、利用の際は引数が負の値の場合の「五入」の動作が、想定とは逆に丸められる動作ではないか注意して利用してください。

// 0 と出力される
System.out.println(Math.round(0.485));

// 1 と出力される
System.out.println(Math.round(0.75));

// 10 と出力される
System.out.println(Math.round(9.5));

// -9 と出力される( X.5 の場合は引数より「大きい」整数の値)
System.out.println(Math.round(-9.5));

// 0 と出力される( 戻り値は整数(int または long)のため通常のゼロ)
System.out.println(Math.round(-0.5));

大小の比較

Math クラスには2つの値のうち小さい値、または大きい値を返すメソッドが準備されています。これらのメソッドを使うことで、小さい値または大きい値を変数に代入する際に、if 分岐を利用せずに簡潔な記述を行うことができます。

最小値を選択(min メソッド)

minメソッドは、2つの引数のうち値の小さな方を返します。このメソッドは、int型、long型、float型、double型の数値を比較するためにオーバーロード(引数の型が異なる同名メソッド)が準備されています。

Math.min メソッド - Java 21 APIドキュメント

メソッドとしては同じ型の引数2つでのオーバーロードメソッドが提供されていますが、異なる型の引数を渡した場合でも、Javaの型昇格ルールに従ってエラーとはならずに比較が行われます。

この際、戻り値の型は、比較対象となった2つの引数の型の中で、より範囲の大きい型に自動的に決定されます。これは、実際に選択された「小さい値」の元の型とは限らない点に注意が必要です。

引数の型の組み合わせによる具体的な戻り値の型は、以下の表に示す通りです。

引数の型↓/→intlongfloatdouble
intintlongfloatdouble
longlonglongfloatdouble
floatfloatfloatfloatdouble
doubledoubledoubledoubledouble
// 1 (int型)が返される
int i = Math.min(1, 2);
System.out.println(i);
		
// Integer.MAX_VALUE (2147483647)の値が long 型で返される
long l = Math.min(Integer.MAX_VALUE, Long.MAX_VALUE);
System.out.println(l);
		
// 0.0(float型)が返される
float f = Math.min(0, 0.1f);
System.out.println(f);

// 100.0(double 型)が返される
double d = Math.min(100L, 100.5d);
System.out.println(d);

最大値を選択(max メソッド)

max メソッドでは、2つの引数のうち値の大きいほうの値を返却します。max メソッドも min メソッドと同様に、int 型、long 型、float 型、double 型が比較でき、戻り値の型も同じく2つの引数の型によって、より範囲の大きい型に決定されます。

Math.max メソッド - Java 21 APIドキュメント

// 2 (int型)が返される
int i = Math.max(1, 2);
System.out.println(i);

// Integer.MAX_VALUE (2147483647) の値が long 型で返される
long l = Math.max(Integer.MAX_VALUE, 0L);
System.out.println(l);

// 1.0(float型)が返される
float f = Math.max(1, 0.1f);
System.out.println(f);

// 100.0(double 型)が返される
double d = Math.max(100L, 99.5d);
System.out.println(d);

絶対値

Math クラスを利用して、数値の絶対値を取得することができます。

絶対値(abs メソッド)

abs メソッドは、引数(int 型、long 型、float 型、double 型)の絶対値を、引数と同じ型で返却します。

Math.abs メソッド - Java 21 APIドキュメント

// 11 と出力される
System.out.println(Math.abs(-11));

// 2147483649 と出力される
System.out.println(Math.abs(-2147483649L));

// 0.001 と出力される
System.out.println(Math.abs(-0.001f));

// 0.123456789 と出力される
System.out.println(Math.abs(-0.12345678900d));


ただし abs メソッドでは、以下の表に示すケースでは特例的な値が返されることに注意してください。

引数の型引数戻り値
abs( int i )Integer.MIN_VALUEInteger.MIN_VALUE(-2147483648)が
そのまま返される
abs( long l )Long.MIN_VALUELong.MIN_VALUE(-9223372036854775808)が
そのまま返される
abs( float f )正のゼロ・負のゼロ正のゼロを返す
abs( float f )正の無限大・負の無限大正の無限大値を返す
abs( float f )NaNNaN を返す
abs( double d )正のゼロ・負のゼロ正のゼロを返す
abs( double d )正の無限大・負の無限大正の無限大値を返す
abs( double d )NaNNaN を返す

平方根・指数・対数

Math クラスでは 指数関数や平方根、対数といった値を扱うためのメソッドも準備されています。

平方根(sqrt メソッド)

sqrt メソッドは引数の平方根を double 型で返します。引数が負の値の場合は エラーとはならず、NaN が返されます。

Math.sqrt メソッド - Java 21 APIドキュメント

// 2の平方根(1.41421356・・・)を出力
System.out.println(Math.sqrt(2));

// 100の平方根(10.0)を出力
System.out.println(Math.sqrt(100));


ただし、引数が無限大、負のゼロ、負の値の場合は特例的な戻り値となることに注意してください。

// 引数が正のゼロの場合は正のゼロ(0.0)
System.out.println(Math.sqrt(0));

// 引数が負のゼロの場合は負のゼロ(-0.0)
System.out.println(Math.sqrt(-0.0));

// 引数が無限大の場合は無限大(Infinity)
System.out.println(Math.sqrt(Double.POSITIVE_INFINITY));

// 引数が負の値の場合は NaN 
System.out.println(Math.sqrt(-1));

指数計算(pow メソッド)

pow メソッドは1番目の引数を、2番目の引数で累乗した値を double 型で返します。

Math.pow メソッド - Java 21 APIドキュメント

// 9.0 と出力される
System.out.println(Math.pow(3, 2));

// 1024.0 と出力される
System.out.println(Math.pow(2, 10));

// 0.1 と出力される
System.out.println(Math.pow(10, -1));

// -125.0 と出力される
System.out.println(Math.pow(-5, 3));


pow メソッドでは、戻り値が無限大になるケース(例:0 の -1 乗)や、NaN となるケース(例:1 の 無限大乗)があることにも注意してください。(詳細は API ドキュメントをご確認ください)

自然対数の底 e の累乗(exp メソッド)

exp メソッドは、自然対数の底であるネイピア数(またはオイラー数) e を 引数で累乗した値を double 型で返します。これは自然対数を返す log メソッドと対となるメソッドと言えます。

Math.exp メソッド - Java 21 APIドキュメント

// ネイピア数 e (2.7182818284・・・)の二乗
System.out.println(Math.exp(2));

// 1.0 が出力される
System.out.println(Math.exp(Math.log(2)));


ただし、引数がゼロ、無限大、NaN の場合は特例的な値が返されることに注意してください。

// 正のゼロの場合は1.0が返される
System.out.println(Math.exp(0.0));

// 負のゼロの場合も1.0が返される
System.out.println(Math.exp(-0.0));

// 正の無限大の場合は無限大(Infinity)が返される
System.out.println(Math.exp(Double.POSITIVE_INFINITY));

// 負の無限大の場合は0.0が返される
System.out.println(Math.exp(Double.NEGATIVE_INFINITY));

// NaNの場合はNaNが返される
System.out.println(Math.exp(Double.NaN));

自然対数(log メソッド)

log メソッドは、引数の自然対数(底を e とした対数)の値を、double 型で返します。前述のとおり、このメソッドは exp メソッドと対となるメソッドと言えます。

Math.log メソッド - Java 21 APIドキュメント

// 10 の自然対数(2.302585…)が返される
System.out.println(Math.log(10));

// 2.0 が返される
System.out.println(Math.log(Math.exp(2)));


ただし、引数がゼロ、無限大、NaN 、負の値および 1 の場合は特例的な値が返されることに注意してください。これらの挙動は、対数の数学的な定義に基づくものです。

// 正のゼロの場合は負の無限大が返される
System.out.println(Math.log(0.0));

// 負のゼロの場合も負の無限大が返される
System.out.println(Math.log(-0.0));

// 正の無限大の場合は正の無限大が返される
System.out.println(Math.log(Double.POSITIVE_INFINITY));

// NaNの場合はNaNが返される
System.out.println(Math.log(Double.NaN));

// 負の値(負の無限大を含む)の場合はNaNが返される
System.out.println(Math.log(-2));

// 「1」の場合は0.0が返される
System.out.println(Math.log(1));

10を底とする対数(log10 メソッド)

log メソッドは、引数に対して底を 10 とする対数の値を、double 型で返します。log メソッドとは底が異なる点に注意してください。

Math.log10 メソッド - Java 21 APIドキュメント

// 3.0 が返される(1000 = 10 ^ 3)
System.out.println(Math.log10(1000));

// -2.0 が返される(0.01 = 10 ^ -2)
System.out.println(Math.log10(0.01));


こちらも log メソッドと同様に、引数がゼロ、無限大、NaN 、負の値および 1 の場合は特例的な値が返されることに注意してください。

// 正のゼロの場合は負の無限大が返される
System.out.println(Math.log10(0.0));

// 負のゼロの場合も負の無限大が返される
System.out.println(Math.log10(-0.0));

// 正の無限大の場合は正の無限大が返される
System.out.println(Math.log10(Double.POSITIVE_INFINITY));

// NaNの場合はNaNが返される
System.out.println(Math.log10(Double.NaN));

// 負の値(負の無限大を含む)の場合はNaNが返される
System.out.println(Math.log10(-100));

// 「1」の場合は0.0が返される
System.out.println(Math.log10(1));

三角関数

Math クラスでは三角関数を扱うためのメソッドも多く準備されています。ここでは、主な三角関数のためのメソッドについて紹介します。

正弦(sin メソッド)

sin メソッドは引数に対する正弦(サイン)の値を double 型で返します。引数の単位はラジアン(弧度法の単位 rad)で指定します。

Math.sin メソッド - Java 21 APIドキュメント

いわゆる度数法による角度(直角 = 90°)の値からラジアンに変換するには、Math クラスの toRadians メソッドを利用して変換するか、ラジアンの定義である 180 / π の逆数を乗じることでも計算できます。

// 1rad に対する正弦の値(0.8414…)
System.out.println(Math.sin(1));

// toRadians メソッドを利用して 90° に対する正弦の値(1.0)を取得
System.out.println(Math.sin(Math.toRadians(90)));

// Math.PI / 180 を乗じる事でも取得可能
System.out.println(Math.sin(90 * ( Math.PI / 180 )));

余弦(cos メソッド)

cos メソッドは引数に対する余弦(コサイン)の値を double 型で返します。こちらも引数の単位はラジアン(弧度法の単位 rad)で指定します。

Math.cos メソッド - Java 21 APIドキュメント

// 1rad に対する余弦の値(0.5403…)
System.out.println(Math.cos(1));

// toRadians メソッドを利用して 180° に対する余弦の値(-1.0)を取得
System.out.println(Math.cos(Math.toRadians(180)));

// Math.PI / 180 を乗じる事でも取得可能
System.out.println(Math.cos(180 * ( Math.PI / 180 )));

正接(tan メソッド)

tan メソッドは引数に対する正接(タンジェント)の値を double 型で返します。こちらも引数の単位はラジアン(弧度法の単位 rad)で指定します。

Math.tan メソッド - Java 21 APIドキュメント

// 1rad に対する正接の値(1.5574…)
System.out.println(Math.tan(1));

// toRadians メソッドを利用して 45° に対する正接の値を取得
System.out.println(Math.tan(Math.toRadians(45)));

// Math.PI / 180 を乗じる事でも取得可能
System.out.println(Math.tan(45 * ( Math.PI / 180 )));

逆正弦・逆余弦・逆正接

Math クラスには逆正弦(アークサイン)、逆余弦(アークコサイン)、逆正接(アークタンジェント)を取得するためのメソッドも準備されています。

逆正弦(アークサイン):
Math.asin メソッド - Java 21 APIドキュメント

逆余弦(アークコサイン):
Math.acos メソッド - Java 21 APIドキュメント

逆正接(アークタンジェント):
Math.atan メソッド - Java 21 APIドキュメント

これらの戻り値の単位はラジアン(rad)のため、角度に変換するには 180 / π を乗じる必要がありますが、これはMath クラスの toDegrees メソッドを利用することで計算できます。

// 1 のアークサインを角度(90.0)に変換して取得
System.out.println(Math.toDegrees(Math.asin(1)));

// 1 のアークコサインを角度(0.0)に変換して取得
System.out.println(Math.toDegrees(Math.acos(1)));

// 1 のアークタンジェントを角度(45.0)に変換して取得
System.out.println(Math.toDegrees(Math.atan(1)));

乱数

ゲームのキャラクターの行動をランダムにしたり、テスト用のデータをランダムに生成したりと、プログラミングでは「予測できない数値」(乱数)が必要になる場面がよくあります。Javaでは、そのための方法がいくつか提供されており、Math クラスでも生成することができます。

疑似乱数の生成(random メソッド)

random メソッドは、0.0 以上 1.0 未満の範囲の double 値を、疑似乱数(※)として返します。これは、Javaで乱数を生成する最もシンプルで手軽な方法です。

Math.random メソッド - Java 21 APIドキュメント

random メソッドで返されるは厳密な乱数ではなく、わずかな偏りが生じますが、試験用のデータを生成したい場合などでは十分利用できます。例えば、以下のサンプルコードでは、random メソッドを利用して 1 ~ 100 までのランダムな整数値を生成し、int 型の配列に格納しています。

int[] intArray = new int[100];
	
for(int i = 0; i < intArray.length; i++) {
	intArray[i] = (int) Math.floor(Math.random() * 100) + 1;
}


(※)「疑似乱数」とは、完全に予測不可能な真の乱数ではなく、一定の法則(ルール)に基づいて生成されるものの、見た目上はほぼランダムに見える数値のことを指します。

まとめ

今回ご紹介したように、Javaで基本的な数学的計算や算術演算を行うには、Mathクラスの利用が不可欠です。

しかし、Mathクラスで扱える数値の型はint、longといった整数値と、floatやdoubleの浮動小数点型であり、特に浮動小数点型については、コンピュータ内部での表現方法の特性上わずかな誤差が生じる可能性がある点には留意が必要です。

次回の記事では、小数を厳密な扱うために不可欠な BigDecimal クラスの利用方法について説明します。

株式会社GSI 採用サイト

新しいこと、始めよう

あなたとともに歩を進めるWEBメディア

広告

広告