22人参与 • 2026-08-02 • Java
在 java 中,基本数据类型的整数有固定取值范围:int、long 容量有限,一旦超出最大值就会发生数值溢出,且编译运行不会报错,导致业务数据错乱。
为解决超大整数运算问题,java 提供了 biginteger 类(位于 java.math 包),专门用于任意长度的超大整数运算,完美支持无限长度整数的加减乘除、取模、幂运算、位运算、进制转换等操作,是算法竞赛、金融统计、密码学、大数加密场景的核心类。
一旦数值超过 long 最大值,基本类型完全无法存储,且溢出静默失效(无报错、结果错误)。
此时必须使用 biginteger。
+ - * / % 运算符,必须调用专属方法运算biginteger 没有无参构造,必须通过指定数值、字符串、进制、数组创建对象。
// 通过 long 数值创建(适合 long 范围内数值) biginteger num1 = biginteger.valueof(123456); // 负数创建 biginteger num2 = biginteger.valueof(-98765);
唯一可以直接定义超出 long 范围超大整数的方式,开发首选。
// 远超 long 最大值的超大整数
biginteger bignum = new biginteger("999999999999999999999999999999");
可将指定进制的数字字符串转为十进制 biginteger。
// 将二进制 1010 转为十进制数字
biginteger binarynum = new biginteger("1010", 2);
// 将十六进制转为十进制
biginteger hexnum = new biginteger("ff", 16);
内置常用常量,无需 new 对象,节省内存:
biginteger.zero; // 0 biginteger.one; // 1 biginteger.two; // 2 biginteger.ten; // 10
所有运算原对象不变,返回新对象,必须接收返回值。
biginteger a = new biginteger("100000000000000000000");
biginteger b = new biginteger("200000000000000000000");
// 1. 加法
biginteger addres = a.add(b);
// 2. 减法
biginteger subres = a.subtract(b);
// 3. 乘法
biginteger mulres = a.multiply(b);
// 4. 除法(整除,只取整数部分)
biginteger divres = b.divide(a);
// 5. 取模
biginteger modres = b.mod(a);
// 6. 求绝对值
biginteger absres = subres.abs();
// 7. 取反
biginteger negres = a.negate();
// 8. 幂运算
biginteger powres = a.pow(3);
// 9. 最大/最小值
biginteger maxres = a.max(b);
biginteger minres = a.min(b);普通 divide 只返回商,divideandremainder 可同时获取商和余数,算法高频使用。
biginteger num = new biginteger("100");
biginteger divisor = new biginteger("3");
// 数组:[0]商,[1]余数
biginteger[] res = num.divideandremainder(divisor);
system.out.println("商:" + res[0]);
system.out.println("余数:" + res[1]);禁止使用 > < == 比较 biginteger 对象,必须使用专属比较方法。
biginteger x = new biginteger("888");
biginteger y = new biginteger("666");
// compareto:大于返回1,等于返回0,小于返回-1
int cmp = x.compareto(y);
// 判断是否相等(推荐,杜绝 == 地址比较坑)
boolean eq = x.equals(y);
// 判断正负、零
boolean zero = x.equals(biginteger.zero);
boolean positive = x.compareto(biginteger.zero) > 0;
boolean negative = x.compareto(biginteger.zero) < 0;biginteger num = new biginteger("255");
string binary = num.tostring(2); // 转二进制
string oct = num.tostring(8); // 转八进制
string hex = num.tostring(16); // 转十六进制
注意:超出基本类型范围会抛异常,转换前需判断范围。
// 转 long(范围溢出抛异常) long longval = num.longvalue(); // 转 int int intval = num.intvalue(); // 精准判断是否可以转为 long boolean canlong = num.bitlength() <= 63;
biginteger n = new biginteger("10");
n.and(biginteger.one); // 与运算
n.or(biginteger.zero); // 或运算
n.xor(biginteger.two); // 异或运算
n.not(); // 取反
n.shiftleft(2); // 左移(乘2^2)
n.shiftright(1); // 右移(除2)
// 获取二进制位数
int bitlen = n.bitlength();
// 判断是否为素数
boolean prime = n.isprobableprime(50); // 参数为置信度所有运算不改变原对象,不接收返回值等于白算。
// 错误写法 biginteger a = biginteger.ten; a.add(biginteger.ten); system.out.println(a); // 仍然是10 // 正确写法 a = a.add(biginteger.ten);
== 比较对象地址,equals 比较数值内容,必须用 equals / compareto。
biginteger 是对象,不支持 + - * /,编译直接报错,必须调用方法。
超出 long 范围的数值,不能用 valueof/数字直接赋值,只能用字符串构造。
到此这篇关于java biginteger 超大整数计算的文章就介绍到这了,更多相关java biginteger 整数计算内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论