Java | Java 標準ライブラリ:Math クラス

Java Java
スポンサーリンク

Math クラスの全体像を直感でつかむ

java.lang.Math は、「よく使う数学系の処理をまとめてくれている“道具箱”」です。
わざわざ自分で実装しなくていいように、基本的な計算用メソッドが一式そろっています。

すべてのメソッドが static なので、new Math() はしません。
Math.abs(...)Math.max(...) のように、クラス名から直接呼ぶだけです。

Java を書いていると、実務でも競技プログラミングでも、
Math クラスは「地味だけど頻繁に触る相棒」になります。


絶対値・最大値・最小値:とっさに使える基本メソッド

abs で「符号を取っ払った値」(絶対値)を求める

絶対値は「マイナスならプラスにする、プラスならそのまま」という変換です。

int a = -10;
int b = 10;

System.out.println(Math.abs(a));  // 10
System.out.println(Math.abs(b));  // 10
Java

引数の型に応じて、int, long, float, double 用のオーバーロードがあります。
「とにかくマイナスをなくしたい」ときは、とりあえず Math.abs と覚えておけば OK です。

max / min で大きい方・小さい方を取る

2つの値から「大きい方」または「小さい方」を取りたいときに使います。

int x = 5;
int y = 8;

int bigger = Math.max(x, y);  // 8
int smaller = Math.min(x, y); // 5
Java

ネストすれば3つ以上も扱えます。

int a = 3, b = 10, c = 7;

int max = Math.max(a, Math.max(b, c));  // 10
int min = Math.min(a, Math.min(b, c));  // 3
Java

条件演算子 ?: で書くよりも、
「最大値を取りたいんだな」と意図が読みやすいのが利点です。


切り上げ・切り捨て・四捨五入(ここはよく使うので深めに)

floor:小数を「下方向に」切り捨て

Math.floor は、「小数点以下を切り捨てる」が、常に“マイナス側”に寄せることに注意です。

System.out.println(Math.floor(3.7));   // 3.0
System.out.println(Math.floor(3.0));   // 3.0
System.out.println(Math.floor(-3.1));  // -4.0 (0 に近づくのではなく、より小さい方へ)
Java

double を返してくるので、int にしたいならキャストします。

int v = (int) Math.floor(3.7);   // 3
Java

ceil:小数を「上方向に」切り上げ

Math.ceil は floor の逆で、「常に“プラス側”に寄せる」動きです。

System.out.println(Math.ceil(3.1));   // 4.0
System.out.println(Math.ceil(3.0));   // 3.0
System.out.println(Math.ceil(-3.7));  // -3.0
Java

やはり double が返るので、必要ならキャストします。

int v = (int) Math.ceil(-3.7);   // -3
Java

round:四捨五入

四捨五入したいときは Math.round を使います。

float を渡すと int が返り、double を渡すと long が返ります。

System.out.println(Math.round(3.4));   // 3
System.out.println(Math.round(3.5));   // 4
System.out.println(Math.round(-3.5));  // -3 (銀行丸めではないことに注意)
Java

「小数第 n 位で四捨五入したい」場合は、一度スケールしてから round します。

例:小数第2位(0.01)で四捨五入して、小数第2位までを残したい場合。

double x = 3.14159;
double scaled = x * 100;                // 314.159
long rounded = Math.round(scaled);      // 314
double result = rounded / 100.0;        // 3.14
System.out.println(result);
Java

「どの位で四捨五入したいか」は、この「掛けて → round → 割る」の部分で調整します。


sqrt / pow / random:数学・アルゴリズム系での定番

sqrt で平方根(ルート)

Math.sqrt は平方根(√)を返します。

System.out.println(Math.sqrt(9));   // 3.0
System.out.println(Math.sqrt(2));   // 約 1.4142...
Java

戻り値は double です。
負の数を渡すと NaN(Not a Number)が返ります。

System.out.println(Math.sqrt(-1));  // NaN
Java

アルゴリズム問題などで「距離」や「ユークリッド距離」を計算するときにもよく出てきます。

pow でべき乗

Math.pow(a, b) は 「(a^b)(a の b 乗)」です。

System.out.println(Math.pow(2, 3));   // 8.0
System.out.println(Math.pow(10, 2));  // 100.0
Java

こちらも戻り値は double なので、整数計算で使うときは注意が必要です。
精度が気になるような場面では、longBigInteger で自前実装を考えることもありますが、
最初のうちは「とりあえずべき乗は Math.pow」と覚えておけば十分です。

random で 0.0〜1.0 未満の乱数

Math.random()0.0 <= x < 1.0 の範囲の double 乱数を返します。

double r = Math.random();
System.out.println(r);  // 0.0 以上 1.0 未満のどれか
Java

整数の乱数が欲しいときは、スケールしてからキャストします。

例:0〜9 の整数乱数。

int n = (int) (Math.random() * 10);  // 0〜9
Java

例:1〜6 のサイコロ。

int dice = (int) (Math.random() * 6) + 1;  // 1〜6
Java

乱数ロジックでは、
「何を掛けるか」と「どれを足すか」で範囲を調整すると覚えてください。


三角関数・指数・対数(必要になったときに思い出せばいい)

sin / cos / tan(ラジアンに注意)

sin, cos, tan はありますが、「引数は度数(°)ではなくラジアン」です。

double rad = Math.toRadians(30);       // 30度 → ラジアンに変換
System.out.println(Math.sin(rad));     // 0.5 に近い値
Java

Math.toRadiansMath.toDegrees が用意されているので、
角度を扱うときはセットで使うと安全です。

exp / log / log10

Math.exp(x) は (e^x)(自然対数の底のべき)です。
Math.log(x) は自然対数 (\ln(x))、Math.log10(x) は常用対数(底10)です。

数値計算や統計・機械学習を真面目にやる段階でお世話になりますが、
初心者のうちは「そういうのもあるんだな」ぐらいで構いません。


static import で Math. を省略する書き方

毎回 Math. と書くのが煩わしい場合、static import を使うと少しだけスッキリ書けます。

import static java.lang.Math.*;

public class Sample {
    public static void main(String[] args) {
        double x = sqrt(2);         // Math. なしで呼べる
        int m = max(3, 5);          // 同上
        System.out.println(x + ", " + m);
    }
}
Java

どこまでやるかは好みですが、
数学っぽいコードを書くときには「読みやすさ」が上がることもあります。

ただし、あちこちで静的インポートを乱用すると、
「この max はどのクラスのメソッド?」と分かりにくくなることもあるので、
「Math だけに使う」などルールを決めておくとよいです。


まとめ:Math クラスをどう頭に入れておくか

初心者として、Math クラスはこのイメージで持っておくと扱いやすくなります。

日常的に使うのはだいたい
「abs(絶対値)」「max/min」「floor/ceil/round」「sqrt」「pow」「random」あたり。
全部 static メソッドなので、Math.メソッド名(...) と呼ぶだけ。
小数処理(切り上げ・切り捨て・四捨五入)は戻り値の型と動きをしっかり区別して覚えると、バグになりにくい。

タイトルとURLをコピーしました