在Java中,由于CPU原生提供的整型数据最大范围是64位的long型整数
那么如果我们在使用的时候数据超过了long型整数的范围该怎么办,这个时候,我们就需要用到Java中的一个类:**java.math.BigInteger **
java.math.BigInteger 就是用来表示任意大小的整数,而BigInteger内部是用一个Int[]数组来模拟的,所以因此可见BigInteger的速度比较慢
进入BigInteger的源代码,我们可以看到:
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
好了,总体的常用方法就是这些,可能看上去有点多了,但是还是希望对你有用。
拜拜~~~