使用 BigInteger 处理超大数字
任意精度整数
使用 BigInteger 处理超大数字 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
超越长整型
基本类型 long 最多可以存储约 920 京的值。当您需要比这个值更大的整数时,Java 提供了 BigInteger。它来自 java.math 包,并且没有固定的上限。
长整型溢出时
超过 Long.MAX_VALUE 会静默回绕为负数。这种数据损坏是产生典型错误的来源。
public class Main {
public static void main(String[] args) {
long max = Long.MAX_VALUE;
System.out.println(max);
System.out.println(max + 1);
}
}创建 BigInteger
从一串数字创建 BigInteger。它没有长度限制,因此您可以写出远大于任何基本类型所能表示的数字。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger huge = new BigInteger("123456789012345678901234567890");
System.out.println(huge);
}
}从长整型开始使用 valueOf
如果您的起始值适合 long,BigInteger.valueOf 就是一种方便的工厂方法。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger n = BigInteger.valueOf(1000000);
System.out.println(n);
}
}不可变算术
与 BigDecimal 一样,BigInteger 也是不可变的。add、subtract 和 multiply 会返回您必须保存的新对象。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("99999999999999999999");
BigInteger b = BigInteger.valueOf(1);
System.out.println(a.add(b));
}
}大数乘法
原本会使 long 溢出的乘法,使用 BigInteger 就可以正常工作。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("10000000000");
BigInteger b = new BigInteger("10000000000");
System.out.println(a.multiply(b));
}
}计算阶乘
阶乘的增长速度非常快。甚至 30 的阶乘也会使 long 溢出,但 BigInteger 可以轻松处理。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger result = BigInteger.ONE;
for (int i = 1; i <= 30; i++) {
result = result.multiply(BigInteger.valueOf(i));
}
System.out.println(result);
}
}幂与模运算
pow 将值提升到整数次幂,mod 返回余数。这两者在密码学中都很常见。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger base = BigInteger.valueOf(2);
System.out.println(base.pow(64));
System.out.println(base.pow(10).mod(BigInteger.valueOf(7)));
}
}比较数值
请使用 compareTo 对两个 BigInteger 值进行排序。它会返回负数、零或正数。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("500");
BigInteger b = new BigInteger("1000");
System.out.println(a.compareTo(b));
}
}实用常量
BigInteger 提供了 ZERO、ONE、TWO 和 TEN。请将它们用作初始累加器或在循环中使用。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger sum = BigInteger.ZERO;
sum = sum.add(BigInteger.TEN).add(BigInteger.ONE);
System.out.println(sum);
}
}何时使用它
请在阶乘、超大计数器、密码学密钥以及任何结果可能超过 long 的场景中使用 BigInteger。对于普通计数,请坚持使用基本类型,因为它们快得多。
快速检查
测试您对 BigInteger 的理解。
回顾
您已经学会使用 BigInteger:
long会静默溢出,而BigInteger没有固定上限- 从字符串或使用
valueOf创建它 - 它是不可变的,因此必须保存每次操作的结果
add、multiply、pow和mod涵盖了常见数学运算- 将它用于阶乘、密码学以及任何大于
long的值
常见问题解答
「使用 BigInteger 处理超大数字」课时是免费的吗?
是的 — 「使用 BigInteger 处理超大数字」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「使用 BigInteger 处理超大数字」这节课中我会学到什么?
任意精度整数 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 BigInteger 处理超大数字」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么不应使用 double 表示金额
- 使用 BigDecimal
- 舍入与刻度
- 使用 BigInteger 处理超大数字