java的math类是java.lang包中开箱即用的静态工具类,无需导入或实例化;核心方法涵盖绝对值、最值、取整、幂根对数、三角函数、随机数等,需注意溢出、精度、类型转换及浮点比较等陷阱。

Java 的 Math 类是开箱即用的数学工具箱,所有方法都是静态的,直接调用 Math.方法名() 即可,无需 import(它在 java.lang 包中)、无需实例化。掌握几个核心方法,就能覆盖绝大多数日常计算需求,比如校验输入、生成随机 ID、做价格比较、算距离或角度等。
绝对值、最值与安全取整
处理数值符号和范围时,别再手写 if 判断:
-
Math.abs(x)支持 int/long/float/double,但注意:Math.abs(Integer.MIN_VALUE)仍返回负数(补码溢出),如需严格非负,改用Math.absExact(x)(Java 8+),它会在溢出时抛出ArithmeticException -
Math.max(a, b)和Math.min(a, b)可混用类型(如int与double),适合比价格、限阈值等场景 - 四舍五入用
Math.round(double)(返回long),它本质是floor(x + 0.5),所以Math.round(-2.5)得-2L;要向下或向上取整,分别用Math.floor(x)(返回 ≥x 的最小 double)和Math.ceil(x)(返回 ≤x 的最大 double),转 int 需显式强转,例如(int) Math.floor(7.9)
幂、根、对数与角度转换
避免手写公式,既易错又难维护:
- 算 2 的 n 次方,优先用位运算
1L (快且无精度损失);<code>Math.pow(2, n)是通用浮点幂函数,对大指数(如 n=60)会丢失精度 -
Math.sqrt(x)要求 x ≥ 0,否则返回NaN;负数开立方请用Math.cbrt(x),它支持全实数域 - 对数用
Math.log(x)(自然对数)或Math.log10(x)(常用对数),输入必须 > 0,否则也返回NaN - 三角函数(
sin/cos/tan)参数是弧度,不是角度。30° 要先转:Math.sin(Math.toRadians(30)),别漏掉转换步骤
随机数生成与范围控制
Math.random() 简单但有细节陷阱:
- 它返回 [0.0, 1.0) 的
double,不是整数。想生成 1–100 的随机整数,正确写法是:(int)(Math.random() * 100) + 1 - 别用
Math.round()做随机整数转换,它会让两端概率偏低(如 0.5 和 99.5 都往中间偏) - 高并发场景下,
Math.random()内部共享一个Random实例,存在竞争;推荐改用ThreadLocalRandom.current().nextInt(1, 101)(含下界、不含上界)
常量、精度与常见避坑
写得快不如写得稳:
- 直接用
Math.PI和Math.E,比硬编码3.14159更准确、语义更清晰 - 所有
Math方法返回值默认是double,整型业务需显式转换,但注意溢出风险(如Math.round(Double.MAX_VALUE)会变成Long.MAX_VALUE) - 浮点数比较不用
==,应结合容差:例如Math.abs(a - b) - 金融类高精度计算(如金额)不建议用
Math类,应改用BigDecimal配合其专用方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











