java处理大数运算应使用biginteger(整数)或bigdecimal(小数),二者均通过字符串构造、方法调用运算、不可变设计确保精度;避免基本类型转换溢出,除法需指定舍入模式。

Java 中处理大数运算,核心是绕过 int、long 的固定位宽限制,改用能动态扩展精度的引用类型。最直接、标准、可靠的方式就是使用 java.math.BigInteger ——它不溢出,不回绕,结果永远精确。
用 BigInteger 替代基本整数类型
遇到可能超限的场景(比如阶乘、大ID计算、密码学运算、超长数字解析),不要硬扛,直接切换类型:
- 创建时优先用字符串:
BigInteger big = new BigInteger("999999999999999999999999999");——避免字面量在编译期就被截断或报错 - 从已有数字转,用
valueOf():BigInteger big = BigInteger.valueOf(1234567890123456789L);——比new BigInteger(String)更高效,但仅适用于 long 范围内值 - 别用
+、-、*等运算符:所有操作必须调方法,例如a.add(b)、a.multiply(b) - 记住它是不可变的:每次运算都返回新对象,原对象不变
算术运算要写对方法名
BigInteger 没有重载运算符,写错方法名或参数类型会导致编译失败或逻辑错误:
- 加减乘除:对应
add()、subtract()、multiply()、divide()(注意除零会抛异常) - 取余推荐
remainder()(支持负数),mod()要求模数为正且结果非负 - 幂运算用
pow(int exponent),指数必须是非负 int;想算 2 的 1000 次方?没问题:BigInteger.valueOf(2).pow(1000) - 比较大小不用
==或>,用compareTo()(返回 -1/0/1);判断相等用equals()
别在中间步骤偷偷退回到基本类型
常见陷阱是“算一半再转回去”,结果刚转就溢出:
- ❌ 错误:
long x = BigInteger.ONE.add(...).longValue();——如果结果超出 long 范围,会静默截断成错误值 - ✅ 正确:全程保持 BigInteger 类型,只在最终确定安全时才转,或用
longValueExact()(溢出会抛ArithmeticException) - 输入来自用户或文件?一律先解析成字符串再建 BigInteger,别试图用 long 接收再转 —— 那一步就已经丢了精度
小数或带精度需求时考虑 BigDecimal
如果运算涉及小数点(比如金额计算、科学计数),BigInteger 不适用,该换 BigDecimal:
- 它处理任意精度十进制数,避免 float/double 的二进制浮点误差
- 构造也推荐字符串:
BigDecimal price = new BigDecimal("199.99"); - 运算同样用方法:
price.add(tax).multiply(new BigDecimal("1.08")) - 注意除法必须指定精度和舍入模式:
result.divide(divisor, 2, RoundingMode.HALF_UP)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











