1. 概述

提到 Java 8 的新特性,大多数人首先想到的是函数式编程和 Lambda 表达式。但除了这些重量级功能,Java 8 还悄悄为 java.lang.Math 核心类增加了一系列实用方法。这些方法虽然不如 Lambda 那样引人注目,但在实际开发中能有效避免一些经典陷阱。

本文将系统介绍 Java 8 为 Math 类新增的所有方法,并附上实用示例。这些方法主要分为两类:带溢出检查的精确运算方法和数学辅助方法。

2. 新增的 *exact() 方法

这类方法在传统运算基础上增加了溢出检查,当结果超出数据类型范围时会直接抛出 ArithmeticException,而不是静默返回错误值。适用于 intlong 类型。

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 类新增的方法虽然低调,但能有效解决两大问题:

  1. 通过 *exact() 方法避免整数溢出的静默错误
  2. 通过 floorDiv()/floorMod() 提供更一致的除法运算语义
  3. 通过 nextDown() 精确控制浮点数精度

这些方法特别适合需要严格数值计算的场景,比如金融系统或科学计算。完整示例代码可在 GitHub 获取。


原始标题:Java 8 Math New Methods