1. 概述
提到 Java 8 的新特性,大多数人首先想到的是函数式编程和 Lambda 表达式。但除了这些重量级功能,Java 8 还悄悄为 java.lang.Math
核心类增加了一系列实用方法。这些方法虽然不如 Lambda 那样引人注目,但在实际开发中能有效避免一些经典陷阱。
本文将系统介绍 Java 8 为 Math
类新增的所有方法,并附上实用示例。这些方法主要分为两类:带溢出检查的精确运算方法和数学辅助方法。
2. 新增的 *exact()
方法
这类方法在传统运算基础上增加了溢出检查,当结果超出数据类型范围时会直接抛出 ArithmeticException
,而不是静默返回错误值。适用于 int
和 long
类型。
2.1. addExact()
执行加法运算,结果溢出时抛出异常:
Math.addExact(100, 50); // 返回 150
Math.addExact(Integer.MAX_VALUE, 1); // 抛出 ArithmeticException
2.2. subtractExact()
执行减法运算,结果溢出时抛出异常:
Math.subtractExact(100, 50); // 返回 50
Math.subtractExact(Long.MIN_VALUE, 1); // 抛出 ArithmeticException
2.3. incrementExact()
执行自增运算,结果溢出时抛出异常:
Math.incrementExact(100); // 返回 101
Math.incrementExact(Integer.MAX_VALUE); // 抛出 ArithmeticException
2.4. decrementExact()
执行自减运算,结果溢出时抛出异常:
Math.decrementExact(100); // 返回 99
Math.decrementExact(Long.MIN_VALUE); // 抛出 ArithmeticException
2.5. multiplyExact()
执行乘法运算,结果溢出时抛出异常:
Math.multiplyExact(100, 5); // 返回 500
Math.multiplyExact(Long.MAX_VALUE, 2); // 抛出 ArithmeticException
2.6. negateExact()
执行取反运算,结果溢出时抛出异常:
Math.negateExact(100); // 返回 -100
Math.negateExact(Integer.MIN_VALUE); // 抛出 ArithmeticException
⚠️ 踩坑提示:最后一个例子需要特别注意。Integer.MIN_VALUE
是 -2,147,483,648,而 Integer.MAX_VALUE
是 2,147,483,647,取反后超出 int
范围导致溢出。
3. 其他新增方法
3.1. floorDiv()
执行除法后对结果向下取整:
Math.floorDiv(7, 2); // 返回 3 (7/2=3.5 → floor(3.5)=3)
Math.floorDiv(-7, 2); // 返回 -4 (-7/2=-3.5 → floor(-3.5)=-4)
3.2. floorMod()
计算除法余数,结果符号与除数一致(修正原文的 modDiv
笔误):
Math.floorMod(5, 3); // 返回 2 (与 % 运算符结果一致)
Math.floorMod(-5, 3); // 返回 1 (因为 floorDiv(-5,3) = -2, 余数= -5 - (-2*3)=1)
✅ 关键区别:当涉及负数时,floorMod()
的结果与 %
运算符不同,确保余数满足 (a = floorDiv(a, b) * b + floorMod(a, b))
恒等式。
3.3. nextDown()
返回比参数略小的相邻浮点数:
float f = Math.nextDown(3.0f); // 返回 2.9999998
double d = Math.nextDown(3.0); // 返回 2.999999761581421
4. 总结
Java 8 为 Math
类新增的方法虽然低调,但能有效解决两大问题:
- 通过
*exact()
方法避免整数溢出的静默错误 - 通过
floorDiv()
/floorMod()
提供更一致的除法运算语义 - 通过
nextDown()
精确控制浮点数精度
这些方法特别适合需要严格数值计算的场景,比如金融系统或科学计算。完整示例代码可在 GitHub 获取。