首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Math 類 API 完全指南:常數、三角函數、對數、隨機數與實用技巧

     編輯:Java 程式設計入門

概覽

java.lang.Math 是 `final` 類,所有方法均為 `static`,無需實例化即可呼叫。它封裝了 IEEE 754 浮點運算標準,提供常用數學運算,效能經過 JVM 內部優化(部分方法映射為 CPU 指令)。

一、核心常數

常數含義近似值
Math.PI圓周率 π3.141592653589793
Math.E自然對數底數 e2.718281828459045

二、絕對值與取整

方法說明回傳型別範例
abs(int/long/float/double)絕對值同參數Math.abs(-5) → 5
ceil(double)向上取整 (≥ 參數的最小整數)doubleMath.ceil(2.3) → 3.0
floor(double)向下取整 (≤ 參數的最大整數)doubleMath.floor(2.9) → 2.0
rint(double)最近整數 (銀行家捨入,.5 向偶數)doubleMath.rint(2.5) → 2.0
round(float/double)四捨五入 (0.5 向正無窮)int/longMath.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)平方根 √aa < 0 返回 NaN
cbrt(double a)立方根 ³√aJDK 5+
pow(double a, double b)a 的 b 次方特殊值處理遵循 IEEE 754
exp(double a)e^a等價 pow(E, a) 但更精確快速
expm1(double a)e^a - 1a 極小時精度更高
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)返回單位在最後一位 (精度分析用)

六、實用技巧與避坑指南

1. 隨機整數範圍 [min, max]

// ThreadLocalRandom (JDK 7+) 效能優於 Math.random(),無競爭
int randomInt = ThreadLocalRandom.current().nextInt(min, max + 1);

// 舊寫法 (不推薦,精度與效能較差)
int randomInt = (int) (Math.random() * (max - min + 1)) + min;

2. 避免浮點數精度陷阱

// 金額計算嚴禁用 float/double
// 錯誤:0.1 + 0.2 = 0.30000000000000004
// 正確:使用 BigDecimal 或整數分單位
BigDecimal price = BigDecimal.valueOf(0.1).add(BigDecimal.valueOf(0.2)); // 0.3

3. 大數次方溢出處理

Math.pow 返回 `double`,超出範圍返回 `Infinity`,不拋異常。精確大整數次方請用 BigInteger.pow(int)。

4. 三角函數角度轉換封裝

public static double sinDeg(double deg) { return Math.sin(Math.toRadians(deg)); }
public static double cosDeg(double deg) { return Math.cos(Math.toRadians(deg)); }

5. 效能關鍵路徑可考慮查表法或近似算法

極高頻呼叫 (如遊戲迴圈、信號處理) 可預計算查表、多項式近似或使用查表庫 (如 fastmath),但需權衡精度與維護成本。

七、JDK 版本新增方法速查 (JDK 5~17)

  • JDK 5: cbrt, log10, log1p, expm1, signum, ulp
  • JDK 8: floorDiv, floorMod, multiplyExact, addExact, subtractExact, incrementExact, decrementExact, negateExact, toIntExact (精確運算,溢出拋 ArithmeticException)
  • JDK 9: fma (融合乘加 a×b+c,高精度)

總結

Math 類是 Java 科學計算的基石。掌握核心方法、理解浮點數特性、善用 ThreadLocalRandom 與 BigDecimal,能避開 90% 的數值計算坑。下次需要「取整、開根號、算角度、產生隨機數」時,請自信地敲下 Math. —— IDE 會提示你所有可用的靜態方法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved