【从零开始学Java | 第十八篇】BigInteger

目录

前言

一、什么是BigInteger?

1.BigInteger构造方法

2.构造方法总结

二、BigInteger常见成员方法

1.加减乘除

2.divideAndRemainder

3.equals

总结


前言

之前我们学习基本数据类型时,知道 int 的最大值大约是 21 亿,而 long 的最大值大约是 900 亿亿。 听起来很大对吧?但是,如果我们要求 100 的阶乘(100!),或者处理加密算法中动辄几百位的超大数字,long 也会瞬间内存溢出。

当基本数据类型无法满足我们的需求时,Java为我们提供了一个工具类------BigInteger

一、什么是BigInteger?

BigInteger 位于 java.math 包下。

与int和long这些受限于计算机硬件位数的基本数据类型不同,BigInteger 是一个引用数据类型(对象)

它在底层实际上是通过动态数组来存储数字的。只要你的电脑内存足够大,它就能存下无限长的数字。

1.BigInteger构造方法

方法名 说明
public BigInteger(int num, Random rnd) 获取随机大整数,范围:0 \~ 2的num次方-1
public BigInteger(String val) 获取指定的大整数
public BigInteger(String val, int radix) 获取指定进制的大整数
public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化

注:BigInteger对象一旦创建,内部记录的值不能发生改变

BigInteger(int num, Random rnd):获取随机大整数,范围:0 \~ 2的num次方-1

java 复制代码
public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            BigInteger bd1 = new BigInteger(4, new Random());
            System.out.println(bd1);
        }
    }
}

运行结果:

BigInteger(String val):获取指定的大整数

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger bd2 = new BigInteger("999999999999999999999");
        System.out.println(bd2);
    }
}

运行结果:

错误范例

当输入小数时:

注:字符串中必须是整数,否则会报错

BigInteger(String val, int radix):获取指定进制的大整数

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger bd4 = new BigInteger("100", 10);
        BigInteger bd5 = new BigInteger("100", 2);
        System.out.println(bd4);
        System.out.println(bd5);
    }
}

运行结果:

注:

1、字符串中的数字必须是整数。

2、字符串中的数字必须要跟进制吻合。

BigInteger valueOf(long val):静态方法获取BigInteger的对象,内部有优化

基础用法:

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger bd1 = BigInteger.valueOf(100);
        System.out.println(bd1);
    }
}

细节1:该方法表示的范围比较小,只能在long的取值范围内,如果超出了long的范围就会报错。

java 复制代码
public class Test {
    public static void main(String[] args) {
        System.out.println(Long.MAX_VALUE);
        BigInteger bd1 = BigInteger.valueOf(9223372036854775807L);
        System.out.println(bd1);
    }
}

但是

细节2:该方法对常用的数字进行了优化,-16 ~ +16,提前把-16 ~ +16创建好BigInteger的对象,如果多次获取不会创建新的。

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger bd1 = BigInteger.valueOf(16);
        BigInteger bd2 = BigInteger.valueOf(16);
        BigInteger bd3 = BigInteger.valueOf(17);
        BigInteger bd4 = BigInteger.valueOf(17);
        System.out.println(bd1 == bd2);
        System.out.println(bd3 == bd4);


    }
}

运行结果:

2.构造方法总结

  1. 如果BigInteger表示的数字没有超出long的范围,可以使用静态方法获取。
  2. 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  3. 对象一旦创建,BigInteger内部记录的值不能发生改变
  4. 只要进行计算都会产生一个新的BigInteger对象。

二、BigInteger常见成员方法

方法名 说明
public BigInteger add(BigInteger val) 加法
public BigInteger subtract(BigInteger val) 减法
public BigInteger multiply(BigInteger val) 乘法
public BigInteger divide(BigInteger val) 除法,获取商
public BigInteger\[\] divideAndRemainder(BigInteger val) 除法,获取商和余数
public boolean equals(object x) 比较是否相同
public BigInteger pow(int exponent) 次幂
public BigInteger max/min(BigInteger val) 返回较大值/较小值
public int intValue(BigInteger val) 转为int类型整数

1.加减乘除

java 复制代码
public class MathDemo {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("10000000000000000000");
        BigInteger b = new BigInteger("20000000000000000000");

        // 加法 (Add)
        BigInteger sum = a.add(b);
        System.out.println("加法结果:" + sum);

        // 减法 (Subtract)
        BigInteger sub = a.subtract(b);

        // 乘法 (Multiply)
        BigInteger mul = a.multiply(b);

        // 除法 (Divide) - 注意:如果是除不尽的,它会像 int 一样直接舍弃小数部分
        BigInteger div = b.divide(a); 
    }
}

2.divideAndRemainder

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("10000000000000000002");
        BigInteger b = new BigInteger("20000000000000000000");

        BigInteger[] c = b.divideAndRemainder(a);
        for (int i = 0; i < 2; i++) {
            System.out.println(c[i]);
        }
    }
}

运行结果:

3.equals

java 复制代码
public class Test {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("10000000000000000002");
        BigInteger b = new BigInteger("20000000000000000000");
        boolean result = a.equals(b);
        System.out.println(result);
    }
}

运行结果:

总结

  • 遇到超大数字,优先使用 new BigInteger("字符串")

  • 使用 addsubtractmultiplydivide

  • 计算结果必须重新赋值,因为它不可变

相关推荐
nanxun8864 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103516 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师8 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师12 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_012 小时前
mac(m5)平台编译openjdk
java
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261352 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程