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 に近づくのではなく、より小さい方へ)
Javadouble を返してくるので、int にしたいならキャストします。
int v = (int) Math.floor(3.7); // 3
Javaceil:小数を「上方向に」切り上げ
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
Javaround:四捨五入
四捨五入したいときは 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 なので、整数計算で使うときは注意が必要です。
精度が気になるような場面では、long や BigInteger で自前実装を考えることもありますが、
最初のうちは「とりあえずべき乗は 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 に近い値
JavaMath.toRadians と Math.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.メソッド名(...) と呼ぶだけ。
小数処理(切り上げ・切り捨て・四捨五入)は戻り値の型と動きをしっかり区別して覚えると、バグになりにくい。
