Math クラスの全体像
Math クラスは「数値計算の基本ツール」をまとめたユーティリティです。すべて static メソッドと定数で構成され、インスタンス化せず Math.メソッド名(...) で使います。加減乗除の次に欲しくなる「べき乗・平方根・三角関数・丸め・最小最大・乱数」などを一式揃えています。重要ポイントは「丸めの正確な使い分け」「浮動小数の特性(NaN・Infinity)」「乱数の選び方」です。
代表的な定数と基本メソッド
定数(円周率と自然対数の底)
System.out.println(Math.PI); // 3.141592653589793
System.out.println(Math.E); // 2.718281828459045
Java計算で頻出する定数を正確に持っています。自分で定義するより Math を使うのが安全です。
最小・最大・絶対値・符号
System.out.println(Math.min(3, 8)); // 3
System.out.println(Math.max(3, 8)); // 8
System.out.println(Math.abs(-10)); // 10
System.out.println(Math.signum(-3.5)); // -1.0(負/ゼロ/正を -1/0/1 で返す)
Java境界処理や安全なクランプの基礎になります。
べき乗・平方根・指数・対数
System.out.println(Math.pow(2, 10)); // 1024.0
System.out.println(Math.sqrt(16)); // 4.0
System.out.println(Math.exp(1)); // e^1
System.out.println(Math.log(Math.E)); // 1.0(自然対数)
System.out.println(Math.log10(1000)); // 3.0(常用対数)
Java性能・精度ともに標準用途では十分です。整数のべき乗はオーバーフローに注意しましょう。
三角関数と角度の扱い(重要ポイントの深掘り)
角度はラジアン前提
double rad = Math.toRadians(30); // 度→ラジアン
System.out.println(Math.sin(rad)); // 0.5(30度の正弦)
System.out.println(Math.cos(rad)); // 0.866025...
System.out.println(Math.tan(rad)); // 0.57735...
JavaMath の三角関数はすべて「ラジアン」。度数法で計算したいときは toRadians/toDegrees を使って変換します。
逆三角関数と範囲
double a = Math.asin(0.5); // 返り値はラジアン(-π/2〜π/2)
System.out.println(Math.toDegrees(a)); // 30.0 度
System.out.println(Math.atan2(1, 1)); // y,x を受け取り象限を考慮
Javaatan2(y, x) はゼロ割や象限の曖昧さを避けるための定番です。角度計算は常に atan2 を選ぶと安全です。
丸め・切り捨て・切り上げ(重要ポイントの深掘り)
基本の丸めメソッド
System.out.println(Math.floor(3.7)); // 3.0(小さい方へ丸め)
System.out.println(Math.ceil(3.1)); // 4.0(大きい方へ丸め)
System.out.println(Math.round(3.5)); // 4(最近接の整数へ、.5は正方向)
System.out.println(Math.rint(3.5)); // 4.0(銀行丸めに近い、偶数優先)
Java- floor/ceil は常に下限/上限方向へ。戻り値は double。
- round は long/int を返し、「.5」を正の無限大側へ丸めます(負数の挙動に注意)。
- rint は「最も近い整数(偶数優先)」を double で返します。
小数点以下の桁で丸める定番手法
double v = 12.3456;
double r = Math.round(v * 100.0) / 100.0; // 2桁に丸め → 12.35
double f = Math.floor(v * 100.0) / 100.0; // 2桁で切り捨て → 12.34
double c = Math.ceil(v * 100.0) / 100.0; // 2桁で切り上げ → 12.35
Java表示目的なら printf("%.2f")、金額など厳密な丸めが必要なら BigDecimal を検討してください。
乱数とハッシュ的ユーティリティ
Math.random の使い方と注意
double r = Math.random(); // 0.0 以上 1.0 未満の一様乱数
int dice = 1 + (int)(Math.random() * 6); // 1〜6
Java手軽ですが、再現性(シード制御)や並行性が必要なら java.util.Random や java.util.concurrent.ThreadLocalRandom を使う方が適切です。
正規化・距離・斜辺
System.out.println(Math.hypot(3, 4)); // 5.0(√(x^2 + y^2) を安全に)
System.out.println(Math.copySign(3.0, -2.0)); // -3.0(符号を別の値に合わせる)
System.out.println(Math.clamp(5, 0, 10)); // Java 21+(境界に収める)
Javahypot はオーバーフロー/アンダーフローに強いピタゴラス距離。Java 21 以降は clamp が標準化され、値の範囲制御が簡潔になります(それ以前は自作)。
前方互換が必要なら次のように書けます。
static int clamp(int v, int min, int max) {
return (v < min) ? min : (v > max) ? max : v;
}
Java浮動小数の特性(NaN/Infinity)の扱い(重要ポイントの深掘り)
NaN と Infinity を理解する
double a = 0.0 / 0.0; // NaN(数字ではない)
double b = 1.0 / 0.0; // Infinity(正の無限大)
double c = -1.0 / 0.0; // -Infinity
System.out.println(Double.isNaN(a)); // true
System.out.println(Double.isInfinite(b)); // true
JavaNaN は比較が常に偽になるため(a == a さえ false)、判定は Double.isNaN を使います。計算に混入すると連鎖するので、入力検証と分岐で早期に弾くのが基本です。
精度誤差への向き合い方
double x = 0.1 + 0.2; // 0.30000000000000004(2進表現の誤差)
boolean eq = Math.abs(x - 0.3) < 1e-9; // 許容誤差で比較
Java浮動小数は「近似」扱いが前提。厳密比較は避け、許容誤差(イプシロン)で比較します。金額など厳密さが必要な領域は BigDecimal を選びます。
例題で身につける
例 1: 角度指定のベクトル合成
public class VectorSum {
public static void main(String[] args) {
double r1 = 10, deg1 = 30;
double r2 = 8, deg2 = 120;
double x = r1 * Math.cos(Math.toRadians(deg1)) + r2 * Math.cos(Math.toRadians(deg2));
double y = r1 * Math.sin(Math.toRadians(deg1)) + r2 * Math.sin(Math.toRadians(deg2));
double len = Math.hypot(x, y);
double deg = Math.toDegrees(Math.atan2(y, x));
System.out.printf("len=%.2f, deg=%.1f%n", len, deg);
}
}
Java例 2: 表示用の丸めと整形
public class RoundAndPrint {
public static void main(String[] args) {
double price = 1234.567;
double taxRate = 0.1;
double taxed = price * (1 + taxRate);
System.out.printf("税込=%,.2f%n", taxed); // 表示は printf で
double twoDigits = Math.round(taxed * 100.0) / 100.0; // 値としての2桁丸め
System.out.println("保存値=" + twoDigits);
}
}
Java例 3: サイコロと安全なクランプ
public class DiceClamp {
static int clamp(int v, int min, int max) {
return (v < min) ? min : (v > max) ? max : v;
}
public static void main(String[] args) {
int d = 1 + (int)(Math.random() * 6);
int hp = clamp(105, 0, 100); // 0〜100に制限
System.out.println("dice=" + d + " hp=" + hp);
}
}
Java仕上げのアドバイス(重要部分のまとめ)
Math は「正確な定数」「定番の関数」「安全な丸め」を提供します。三角関数はラジアン前提、丸めは目的別に floor/ceil/round/rint を使い分ける。表示は printf、厳密な金額は BigDecimal。乱数は手軽な Math.random と、実務向けの Random/ThreadLocalRandom を使い分ける。NaN/Infinity と誤差の性質を理解し、許容誤差比較や入力ガードで堅牢に。計算は「何を求めたいか」を先に言語化して、適切な Math のピースを選びましょう。
