【Java常用类】1-6 BigInteger 类

§1-6 BigInteger

1-6.1 使用 BigInteger

BigInteger 常常用于解决超出基本类型上限的整型数据问题。它也位于 java.math 包下,继承自 Number

构造方法

构造方法 描述
BigInteger(String val) BigInteger 的十进制字符串表示形式转换为 BigInteger。推荐使用此方法。
BigInteger(int numBits, Random rnd) 构造一个随机生成的 BigInteger,均匀分布在 0 到 (\(2^{\text{numBits}} - 1\)), 包括在内。
BigInteger(String val, int radix) 将指定基数中 BigInteger 的字符串表示形式转换为 BigInteger

静态方法

静态方法 描述
static BigInteger valueOf(long val) 返回一个 BigInteger,其值等于指定的 long 的值。

使用建议

  1. 一般而言,对于所创建的整型大小不确定,优先选择 BigInteger(String val) 方法创建对象;
  2. 当所创建的对象数值坐落于 long 类型的范围,数值不大且确定,可使用静态的 valueOf() 方法;
  3. Integer 类类似,BigInteger 类也有 “缓冲区”。调用 valueOf() 方法时,若传入的参数范围位于 \([-16, 16]\) ,则返回已经创建好的对象,否则则在堆中新建对象;

由于不再属于基本数据类型,只能够通过使用内置方法进行计算。

常用方法

方法 描述
BigInteger abs() 返回该 BigInteger 的绝对值。
BigInteger add(BigInteger val) 加法
BigInteger subtract(BigInteger val) 减法
BigInteger multiply(BigInteger val) 乘法
BigInteger divide(BigInteger val) 除法,返回商
BigInteger divideAndRemainder(BigInteger val) 返回数组,含有商和余数
BigInteger remainder(BigInteder val) 返回余数
BigInteger negate() 返回相反数
BigInteger pow(int exponent) 返回幂
BigInteger sqrt() 返回整数平方根
BigInteger mod(BigInteger m) 求模
BigInteger max/min(BigInteger val) 返回最值
int intValue() 返回该 BigIntegerint 转换
int intValueExact() 返回该 BigIntegerint 转换,并检查丢失信息
boolean equals() 判断二者数值是否相等
int compareTo() 判断二者数值是否相等,大于返回 1,等于返回 0,小于返回 -1

注意

  1. int intValue() 方法在转换过程中,若 BigInteger 太大而无法放入 int 中,则仅返回低位 32 位。此转换可能会丢失有关 BigInteger 整体大小的信息,并返回一个带有相反符号的结果。同样地,类似的情况也会发生在 doubleValue()longValue() 方法中,对于 double,若量级太大而无法表示,则会根据需要转换为 double_NEGATIVE_INFINITYdouble_POSITIVE_INFINITY
  2. int intValueExact() 方法在转换过程中,若转换超出范围,无法放入 int 中,则抛出异常 ArithmeticException。类似地,相同的情况也会发生在 byteValueExact()longValueExact() 等方法中;
  3. 返回最值时,方法不会创建新的对象,而是返回符合要求的对象。

1-6.2 注意事项

  1. 对象创建好后,其值不可被改变;
  2. 注意创建对象时,传入参数必须合法:字符串不可包含非法字符,传入整型必须符合进制要求;
  3. BigDecimal,只要进行了计算,都会产生一个新的 BigInteger 对象;
  4. BigInteger 也支持一些基本的数学运算:四则运算、幂运算、整数平方根、绝对值、相反数、求余数、求模运算、最值、最大公约数等。注意,返回结果均为 BigInteger,即全为整型;

1-6.3 底层原理

在计算机中,所有的数据都是以一串串的 0 和 1 表示,数据类型是由编程语言决定的。

BigInteger 存储数据的原理如下:

以数字 27679116119564327424 为例

  1. 将传入的数字使用二进制补码表示;

    本例,转换后得到 1_100000000000000000000000000000000000_000000000000000000000000000000000000

  2. 将该补码以 32 位(int表示范围)为一组,拆开后各自转成十进制;

    转换后得到数组 1, -2147483648, 0

  3. 将数组保存在成员数组 mag 中,并用 int signum 记录数字符号;

    注:signum == -1 为负数,signum == 0 为零,signum == 1 为正数。

而数组的最大长度为 int 上限(约为 21 亿),数组元素都为 int,每一个元素能表示的数字约为 42 亿个,则 BigInteger 所能存储的理论最大数字约为 \((4.2 \times 10^{8})^{2.1 \times 10^{8}}\) 。因此可认为,BigInteger 所能表示的最大数接近无限。

posted @ 2023-07-19 23:31  Zebt  阅读(83)  评论(0)    收藏  举报