Java | 基礎文法:Math クラス基礎

Java Java
スポンサーリンク

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...
Java

Math の三角関数はすべて「ラジアン」。度数法で計算したいときは 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 を受け取り象限を考慮
Java

atan2(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.Randomjava.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+(境界に収める)
Java

hypot はオーバーフロー/アンダーフローに強いピタゴラス距離。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
Java

NaN は比較が常に偽になるため(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 のピースを選びましょう。

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