Java大数字计算必须用BigInteger和BigDecimal,因int、long等基本类型会静默溢出;BigInteger支持任意精度整数运算,BigDecimal保障小数精度,均需用String构造以避免误差。

Java 中的大数字计算不能用基本类型直接实现,因为基本类型(如 int、long)有固定范围限制:
-
int:最大值是 2³¹−1 ≈ 21 亿 -
long:最大值是 2⁶³−1 ≈ 9.2 × 10¹⁸
一旦运算结果超过这些范围,就会静默溢出(不报错,但结果错误),所以基本类型无法安全处理“大数字”计算。
真正可行的方式是使用 Java 标准库提供的 BigInteger 和 BigDecimal —— 它们是引用类型,底层用数组存储任意精度的整数或小数,完全规避了基本类型的位宽限制。
✅ 正确做法:用 BigInteger 做大整数运算
BigInteger 支持加、减、乘、除、幂、模、比较、位运算等,所有操作都无精度丢失。
import java.math.BigInteger;
public class BigNumDemo {
public static void main(String[] args) {
// 从字符串构造(推荐),避免 long 溢出
BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = BigInteger.valueOf(9876543210L); // 或用字符串更安全
BigInteger sum = a.add(b);
BigInteger product = a.multiply(b);
BigInteger pow = a.pow(3);
System.out.println("和: " + sum);
System.out.println("积: " + product);
System.out.println("立方: " + pow);
}
}
⚠️ 注意:
- 不要用
new BigInteger(long)构造超大数,因为long本身装不下;优先用String构造。 -
BigInteger是不可变类,每次运算返回新对象。 - 没有操作符重载(不能写
a + b),必须调用.add()、.multiply()等方法。
✅ 高精度小数计算:用 BigDecimal
需要精确小数运算(比如金融计算)时,绝不能用 float 或 double(存在二进制浮点误差),应使用 BigDecimal:
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal x = new BigDecimal("19.99");
BigDecimal y = new BigDecimal("0.07");
BigDecimal tax = x.multiply(y).setScale(2, RoundingMode.HALF_UP);
System.out.println("税额: " + tax); // 输出 1.40(不是 1.3993)
关键点:
- 始终用
String构造,避免double参数引入误差(如new BigDecimal(0.1)实际是0.10000000000000000555...)。 - 除法必须指定精度和舍入模式(
.divide(divisor, scale, roundingMode))。 -
.equals()比较值+精度(1.0≠1.00),判断相等用.compareTo() == 0。
❌ 为什么不能“用基本类型实现”大数字?
有人想通过 long[] 自己模拟大数(如每位存一段),这属于手动实现大数算法,不是“用基本类型实现”,而是:
- 写大量代码(加减乘除进位借位、符号处理、归一化……)
- 容易出错,性能通常不如
BigInteger(后者已高度优化,还支持 Karatsuba 乘法、蒙哥马利幂等) -
BigInteger本身就是基于int[]实现的,你重复造轮子没优势
所以——别绕路,直接用 BigInteger / BigDecimal。它们是 JDK 的标准方案,稳定、高效、经过充分测试。
不复杂,但容易忽略:选对类型,比优化算法更重要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











