掌握math类需理解核心操作:abs/signum处理符号与溢出;sqrt/pow/cbrt/hypot注意输入合法性与nan;floor/ceil/round/rint取整规则各异;random生成区间数要修正,max/min不支持数组且遇nan返回nan。

掌握 Math 类的常用数学运算方法,关键不是死记硬背所有方法,而是理解几类核心操作的用途、参数规则和典型陷阱。它位于 java.lang 包下,无需 import,所有方法都是静态的,直接用 Math.方法名() 调用即可。
绝对值与符号判断:abs 和 signum
这是最基础也最常被忽略细节的一组。
-
Math.abs() 支持 int、long、float、double 四种类型,返回对应类型的非负值;注意它对 Integer.MIN_VALUE 等极值取绝对值会溢出(如
Math.abs(Integer.MIN_VALUE)仍是负数)。 -
Math.signum() 只接受 float/double,返回 1.0、-1.0 或 0.0,适合快速判断方向,比如控制角色左右移动:
if (Math.signum(velocityX) > 0) moveRight();
开方、幂运算与几何计算:sqrt、pow、cbrt、hypot
这些方法都要求输入合法,否则返回 NaN(Not a Number),需提前校验或容错处理。
-
Math.sqrt() 仅支持非负数,
Math.sqrt(-1)得到 NaN;而 Math.cbrt() 支持负数,Math.cbrt(-27)返回 -3.0。 -
Math.pow(a, b) 中若 a 为负数,b 必须是整数,否则结果为 NaN(如
Math.pow(-4, 0.5)不合法)。 -
Math.hypot(a, b) 是计算 √(a² + b²) 的安全方式,比手动写
Math.sqrt(Math.pow(a,2) + Math.pow(b,2))更抗大数溢出,推荐用于勾股定理类场景。
取整操作:floor、ceil、round、rint
它们返回值类型不同,行为逻辑也容易混淆,重点看“朝哪边舍”和“返回什么类型”。
-
Math.floor() 向负无穷取整(≤ 当前值的最大整数),返回 double,如
Math.floor(-2.3)→ -3.0。 -
Math.ceil() 向正无穷取整(≥ 当前值的最小整数),返回 double,如
Math.ceil(-2.3)→ -2.0。 -
Math.round() 是四舍五入,但底层是
floor(x + 0.5),所以Math.round(-2.5)→ -2(不是 -3);返回 int 或 long,取决于参数类型。 -
Math.rint() 遵循银行家舍入法(偶数优先),
Math.rint(2.5)和Math.rint(3.5)都返回 2.0 和 4.0(靠近偶数)。
随机数与极值:random、max、min
看似简单,但实际使用中高频出错。
-
Math.random() 返回 [0.0, 1.0) 的 double,要生成 [min, max] 闭区间整数,正确写法是:
(int)(Math.random() * (max - min + 1)) + min。 - Math.max() 和 Math.min() 支持 int/long/float/double 四种重载,但不能传数组或多个参数;如果需要找一组数中的最大值,得自己循环调用或改用 Stream。
- 它们不处理 NaN:只要任一参数是 NaN,结果就是 NaN,必要时先用
Double.isNaN()过滤。










