Java中高精度整数通过不可变类BigInteger实现,用动态int数组存储,支持任意大小整数运算;必须用它处理超大数因long类型溢出静默错误;创建需用字符串或valueOf,运算须调用add、multiply等方法,禁止使用+、==。

高精度整数在 Java 中不是基本类型,而是通过 BigInteger 这个不可变类实现的——它不依赖固定字节长度,而是用动态数组按块存储数字,理论上只受内存限制,能精准表示任意大小的整数。
为什么必须用 BigInteger 处理超大数字
Java 的 long 最大值是 9223372036854775807(约 9.2×10¹⁸),一旦运算结果超过这个范围,就会溢出且静默出错。比如计算 100!、RSA 密钥中的大素数乘积、天文计数或区块链地址哈希值,用 long 会直接得到错误结果。BigInteger 从设计上就规避了这个问题。
- 底层用 int 数组分段存数,自动扩容
- 所有运算(加减乘除等)都返回新对象,原值不变
- 无精度丢失,适用于密码学、金融级整数场景
怎么创建一个真正“超大”的 BigInteger
不能写 BigInteger n = 123456789012345678901234567890L——字面量在编译期就溢出了。必须绕过基本类型转换:
- 超大整数:用字符串构造,
new BigInteger("123456789012345678901234567890") - 小整数(≤long 范围):用
BigInteger.valueOf(123L),更高效(-16~16 有缓存) - 进制转换:如二进制字符串
new BigInteger("1101", 2)→ 十进制 13 - 随机大数:用于加密,
new BigInteger(1024, new Random())生成 1024 位随机正整数
核心运算怎么写才不出错
BigInteger 不支持 + - * / % 运算符,所有计算必须调用方法;也不能用 == 比较值:
立即学习“Java免费学习笔记(深入)”;
- 加减乘除:用
a.add(b)、a.subtract(b)、a.multiply(b)、a.divide(b) - 取余和模:区分
a.remainder(b)(结果可负)和a.mod(b)(要求 b > 0,结果非负) - 比较大小:用
a.compareTo(b),返回 -1/0/1;判断相等用a.equals(b) - 幂与最大公约数:
a.pow(10)(指数必须 ≥ 0)、a.gcd(b)
转换和使用时的关键注意事项
从 BigInteger 转回基本类型看似简单,但极易出错:
- 转 int/long:优先用
intValueExact()和longValueExact(),超范围直接抛ArithmeticException,比静默截断更安全 - 转字符串:
toString()默认十进制;toString(16)可转十六进制,适合输出密钥或哈希 - 空格和前导零:构造时字符串不能含空格,也不能有无关前导零(如 "00123" 会报错,除非就是 "0")
- 除零检查:每次
divide或mod前,务必用b.equals(BigInteger.ZERO)判定


















