浅谈Java中的BigInteger类

357 阅读3分钟

在Java中,由于CPU原生提供的整型数据最大范围是64位的long型整数

那么如果我们在使用的时候数据超过了long型整数的范围该怎么办,这个时候,我们就需要用到Java中的一个类:**java.math.BigInteger **

java.math.BigInteger 就是用来表示任意大小的整数,而BigInteger内部是用一个Int[]数组来模拟的,所以因此可见BigInteger的速度比较慢

进入BigInteger的源代码,我们可以看到:

7617b0ac32193ef12ba6495976e6940a.png

BigInteger和Integer、Long一样,也是不可变类,并且都继承了Number,而Number定义了转换为基本类型的几个方法:

byteValue()

shortValue()

intValue()

longValue()

floatValue()

doubleValue()

所以BigInteger是可以转换为基本类型的,但是如果在转换时,BigInteger表示的值已经超出了基本类型的范围,那么转换时将丢失高位信息,得到的结果也是不准确的,那么如果BigInteger的值超过了float的最大范围,就会返回一个Infinity(无穷大)

如果我们需要得到一个正确的结果并出现错误时抛出异常,那么可以使用:

byteValueExact()

shortValueExact()

intValueExact()

longValueExact()

下面就写一下一些BigInteger的用法:

1、赋值

字符串转数字

BigInteger a=new BigInteger("1");

BigInteger的默认构造方法为十进制,当然,也支持自定义进制类型

BigInteger b = new BigInteger("10000000", 2); // 输入2进制转10进制
System.out.println(b); // 输出 8

字节数组转十进制

byte[] arr = {1,0};
BigInteger b01 = new BigInteger(arr);
System.out.println(b01); // 输出256

2、运算

BigInteger a = new BigInteger("99999999999999999");
BigInteger b = new BigInteger("99999999999999999");
 
BigInteger add = a.add(b);// 加法
 
BigInteger subtract = a.subtract(b); // 减法
 
BigInteger multiply = a.multiply(b); // 乘法
 
BigInteger divide = a.divide(b); // 除法
 
BigInteger mod = a.mod(b); // 取余(只返回正数)
 
BigInteger remainder = a.remainder(b); // 取余(正负数都有可能返回)
 
// 求商和余数
BigInteger[] bigIntegers = a.divideAndRemainder(b); // 返回一个BigInteger数组,
// bigIntegers[0]是a/b的商,bigIntegersp[1]是a%b的余
System.out.println(bigIntegers[0]+" "+bigIntegers[1]); // 1 0(商1,余0)

3、比较两个数的大小

compareTo()

在前边我们就看到了BigInteger是继承了Comparable接口的

BigInteger a = new BigInteger("6"); 
BigInteger b = new BigInteger("18");
int i = a.compareTo(b); // a和b谁大,小于返回-1,等于返回0,大于返回1
System.out.println(i);

min()与max()来比较大小并返回一个值

BigInteger max = a.max(b);  // 返回a和b中较大的一个
System.out.println(max); // 18
 
BigInteger min = a.min(b); // 返回a和b中较小的一个
System.out.println(min); // 6

4、取最大公约数

计算两个数的最大公约数(这个方法还是比较好用的)

BigInteger a = new BigInteger("4");
BigInteger b = new BigInteger("6");
BigInteger gcd = a.gcd(b); // a和b的最大公约数
System.out.println(gcd); // 2

5、和Math类相同的方法

min()和max()我们就不用说了

BigInteger pow = a.pow(4); // 返回a的4次幂,即a^4
System.out.println(pow); // 16
 
BigInteger abs = a.abs(); // a的绝对值

6、素数

下面是素数的判断和获取(相信这个还是很好用的,很多次在做题的时候都会遇到求素数检测是否为素数)

BigInteger a = new BigInteger("2");
// 1.判断一个数是否是素数
boolean probablePrime = a.isProbablePrime(1); // 如果返回false,那么一定是合数。如果返回true可能是素数,概率和传入值有关
System.out.println(probablePrime);
 
// 2.获取下一个素数,返回是合数的概率为2的-100次方。还有有概率返回偶数的。
BigInteger b = a.nextProbablePrime(); // 返回大于a的下一个素数
System.out.println(b); // 3

7、long转BigInteger(静态方法)

使用valueOf()方法可以将一个Long类型的数字转换为BigInteger类型

long lg = 12345678910000l;
BigInteger b = BigInteger.valueOf(lg);
System.out.println(b); // 输出 12345678910000

好了,总体的常用方法就是这些,可能看上去有点多了,但是还是希望对你有用。

拜拜~~~