java.lang.Math 是 `final` 類,所有方法均為 `static`,無需實例化即可呼叫。它封裝了 IEEE 754 浮點運算標準,提供常用數學運算,效能經過 JVM 內部優化(部分方法映射為 CPU 指令)。
| 常數 | 含義 | 近似值 |
|---|---|---|
Math.PI | 圓周率 π | 3.141592653589793 |
Math.E | 自然對數底數 e | 2.718281828459045 |
| 方法 | 說明 | 回傳型別 | 範例 |
|---|---|---|---|
abs(int/long/float/double) | 絕對值 | 同參數 | Math.abs(-5) → 5 |
ceil(double) | 向上取整 (≥ 參數的最小整數) | double | Math.ceil(2.3) → 3.0 |
floor(double) | 向下取整 (≤ 參數的最大整數) | double | Math.floor(2.9) → 2.0 |
rint(double) | 最近整數 (銀行家捨入,.5 向偶數) | double | Math.rint(2.5) → 2.0 |
round(float/double) | 四捨五入 (0.5 向正無窮) | int/long | Math.round(2.5) → 3 |
輸入/輸出單位均為弧度。
| 方法 | 說明 |
|---|---|
sin/cos/tan(double a) | 正弦/餘弦/正切 |
asin/acos/atan(double a) | 反正弦/反餘弦/反正切 (結果範圍 -π/2~π/2) |
atan2(double y, double x) | 反正切,利用象限判斷角度 (-π~π),比 atan(y/x) 更穩健 |
toDegrees(double rad) | 弧度 → 角度 |
toRadians(double deg) | 角度 → 弧度 |
| 方法 | 說明 | 備註 |
|---|---|---|
sqrt(double a) | 平方根 √a | a < 0 返回 NaN |
cbrt(double a) | 立方根 ³√a | JDK 5+ |
pow(double a, double b) | a 的 b 次方 | 特殊值處理遵循 IEEE 754 |
exp(double a) | e^a | 等價 pow(E, a) 但更精確快速 |
expm1(double a) | e^a - 1 | a 極小時精度更高 |
log(double a) | 自然對數 ln(a) | a ≤ 0 返回 NaN |
log10(double a) | 以 10 為底對數 | JDK 5+ |
log1p(double a) | ln(1+a) | a 極小時精度更高 |
| 方法 | 說明 |
|---|---|
max/min(int/long/float/double) | 兩值中較大/較小 |
random() | 返回 [0.0, 1.0) 間均勻分佈偽隨機 double |
IEEEremainder(double f1, double f2) | IEEE 754 定義餘數 (非常用 % 運算符) |
signum(double/int/float) | 符號函數:正→1、負→-1、零→0 |
ulp(double/float) | 返回單位在最後一位 (精度分析用) |
// ThreadLocalRandom (JDK 7+) 效能優於 Math.random(),無競爭
int randomInt = ThreadLocalRandom.current().nextInt(min, max + 1);
// 舊寫法 (不推薦,精度與效能較差)
int randomInt = (int) (Math.random() * (max - min + 1)) + min;
// 金額計算嚴禁用 float/double
// 錯誤:0.1 + 0.2 = 0.30000000000000004
// 正確:使用 BigDecimal 或整數分單位
BigDecimal price = BigDecimal.valueOf(0.1).add(BigDecimal.valueOf(0.2)); // 0.3
Math.pow 返回 `double`,超出範圍返回 `Infinity`,不拋異常。精確大整數次方請用 BigInteger.pow(int)。
public static double sinDeg(double deg) { return Math.sin(Math.toRadians(deg)); }
public static double cosDeg(double deg) { return Math.cos(Math.toRadians(deg)); }
極高頻呼叫 (如遊戲迴圈、信號處理) 可預計算查表、多項式近似或使用查表庫 (如 fastmath),但需權衡精度與維護成本。
cbrt, log10, log1p, expm1, signum, ulpfloorDiv, floorMod, multiplyExact, addExact, subtractExact, incrementExact, decrementExact, negateExact, toIntExact (精確運算,溢出拋 ArithmeticException)fma (融合乘加 a×b+c,高精度)Math 類是 Java 科學計算的基石。掌握核心方法、理解浮點數特性、善用 ThreadLocalRandom 與 BigDecimal,能避開 90% 的數值計算坑。下次需要「取整、開根號、算角度、產生隨機數」時,請自信地敲下 Math. —— IDE 會提示你所有可用的靜態方法。