java中BigInteger用法的详解
Posted 码界猿候
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中BigInteger用法的详解相关的知识,希望对你有一定的参考价值。
在java中经常会遇到比较大的数,甚至超过了long型,那么该如何处理这些“大数据”呢?在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,从原则上是可以表示“天文单位”一样大的数字咯,但有一个缺点就是比较费内存!
在这里,我们详细描述下BigInteger的用法,在使用之前,我们需要导入java.math.*包
一.介绍BigInteger经常使用到的一些函数
①value.Of(参数); 这个函数的作用是将括号内的参数转换成指定的数据类型,例如以下例子
• int A=42;
• BigInteger f=BigInteger.valueOf(A);
• System.out.println("f="+f); //输出的f将会等于BigInteger型的42
• // 答案: f=42
其实还可以转成其他的类型,例如以下以下,※※※需要注意的是不重写的话,jdk1.8 版本是无法支持这种转换的※※※
• String s="12345";
• BigInteger c=BigInteger.valueOf(s);
• // 则c=12345;※※※需要注意的是不重写的话,jdk1.8 版本是无法支持这种转换的
②add()方法; 这个函数的作用是将大整数加起来,例如以下例子
• BigInteger c=new BigInteger("6");
• BigInteger d=new BigInteger("3");
• System.out.println("c+d="+c.add(d));
//答案输出: c+d=9
③subtract()方法,这个函数的作用是将大整数相减,例如以下例子,运用时前者减后者
• BigInteger c=new BigInteger("5");
• BigInteger d=new BigInteger("3");
• System.out.println("d-c="+d.subtract(c));
//答案输出: d-c=-2
④multiply()方法,这个函数的作用是将大整数相乘,例如以下例子,
• BigInteger c=new BigInteger("6");
• BigInteger d=new BigInteger("3");
• System.out.println("c*d="+c.multiply(d));
//答案输出: c*d=18
⑤divide()方法,这个函数的作用是将大整数做除法,例如以下例子,
• BigInteger c=new BigInteger("6");
• BigInteger d=new BigInteger("4");
• System.out.println("c/d="+c.divide(d));
// 答案输出;c/d=1
⑥remainder()方法,这个函数的作用是将大整数取余
⑦pow(exponent)方法,这个函数的作用是将大整数取exponent的指数,例如a.pow(b)==a^b;
⑧gcd()方法,这个函数的作用是将两个大整数取最大公约数,例如a.gcd(b);
⑨abs()方法,这个函数的作用是取绝对值,例如
• BigInteger c=new BigInteger("-9");
• System.out.println(c.abs());
//答案输出: 9
⑩negate()方法,这个函数的作用是取数的相反数,例如
• BigInteger c=new BigInteger("9");
• System.out.println(c.negate());
// 答案输出: -9
⑪mod()方法; 这个函数的作用是对数进行取余 a.mod(b)=a%b=a.remainder(b);
⑫max()方法,min()方法,分别是比较两个数的大小,例如a.max(b); 取a,b中的最大值
⑬compareTo()方法这个方法是用来比较两个大整数大小的
• public void testCompare()
• BigInteger bigNum1 = new BigInteger("52");
• BigInteger bigNum2 = new BigInteger("27");
• //1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
• int num = bigNum1.compareTo(bigNum2); //1
• //2.max():直接返回大的那个数,类型为BigInteger
• // 原理:return (compareTo(val) > 0 ? this : val);
• BigInteger compareMax = bigNum1.max(bigNum2); //52
• //3.min():直接返回小的那个数,类型为BigInteger
• // 原理:return (compareTo(val) < 0 ? this : val);
• BigInteger compareMin = bigNum1.min(bigNum2); //27
•
⑭equals()方法,判断两个大整数是否相等,例如c.equals(d) 相等就返回 true;
二、介绍BigInteger的读入方法——nextBigInteger(),从控制台读入一个BigInteger型数据,类似于读入int型的nextInt();
public void test()
Scanner s = new Scanner(System.in); // 读入
int n = sc.nextInt(); // 读入一个int;
BigInteger m = sc.nextBigInteger(); // 读入一个BigInteger;
while(sc.hasNext())
System.out.print("sc.hasNext()=" + sc.hasNext());
三、介绍BigInteger的构造方法
默认的是十进制,也就是我们平常较为常见的,例如
• BigInteger d=new BigInteger("48");
• System.out.println(d); //答案输出:48,这里默认的是十进制,但也支持自定义转换类型
支持自定义进制类型(已存在的),例如二进制,四进制,八进制,十六进制,如下:
•public void test()
• //在构造将函数时,把radix进制的字符串转化为BigInteger
• String str = "1011100111";
• int radix = 2; // radix代表二进制,为下一行代码中的参数radix赋值
• BigInteger interNum1 = new BigInteger(str,radix); //743
•
四、介绍BigInteger的几个内部定义的常量——BigInteger.ZERO,BigInteger.ONE,BigInteger.TEN
//之前是支持-1和2,但现在表明已不再输出(Not exported.)
public void test()
//0
BigInteger zero = BigInteger.ZERO;
//1
BigInteger one = BigInteger.ONE;
//10
BigInteger ten = BigInteger.TEN;
五、介绍BigInteger一些基本类型的转换
public void testToAnother()
BigInteger bigNum = new BigInteger("38");
int radix = 2;
//1.转换为bigNum的二进制补码形式
byte[] num1 = bigNum.toByteArray();
//2.转换为bigNum的十进制字符串形式
String num2 = bigNum.toString(); //38
//3.转换为bigNum的radix进制字符串形式
String num3 = bigNum.toString(radix); //100110
//4.将bigNum转换为int
int num4 = bigNum.intValue();
//5.将bigNum转换为long
long num5 = bigNum.longValue();
//6.将bigNum转换为float
float num6 = bigNum.floatValue();
//7.将bigNum转换为double
double num7 = bigNum.doubleValue();
六、权限控制
setBit(),testBit():可用于菜单的权限控制,非常好用,原理如下:
//权限控制:setBit(),testBit()
@Test
public void testSetAndTest()
//1.封装数据(setBit的值需 >= 0,否则出现异常:ArithmeticException("Negative bit address"))
BigInteger permission = new BigInteger("0");
BigInteger numBig = permission.setBit(2);
numBig = numBig.setBit(5);
numBig = numBig.setBit(13);
numBig = numBig.setBit(66);
System.out.println("原理:" + numBig);
// 原理:73786976294838214692 = 2^2+2^5+2^13+2^66 次方的和;
// 看!!即使这么大的数也不会溢出,而int最大值只有2147483647;
//2.取值验证(返回Boolean型)
boolean flag1 = numBig.testBit(2); //true
boolean flag2 = numBig.testBit(5); //true
boolean flag3 = numBig.testBit(13); //true
boolean flag4 = numBig.testBit(66); //true
boolean flag5 = numBig.testBit(27); //false
setBit():将set进去变量作为二进制数,计算它们的和,并以十进制显示; testBit():与setBit()相反,验证this的二进制组成元素中是否包含传入的变量;
//权限控制源码分析:
//1.setBit()原理:计算this与2的n次方的和
public BigInteger setBit(int n)
if (n < 0)
throw new ArithmeticException("Negative bit address");
int intNum = n >>> 5;
int[] result = new int[Math.max(intLength(), intNum+2)];
for (int i=0; i < result.length; i++)
result[result.length-i-1] = getInt(i);
result[result.length-intNum-1] |= (1 << (n & 31));
return valueOf(result);
//2.testBit()原理:计算this的值中是否包含2的n次方
public boolean testBit(int n)
if (n < 0)
throw new ArithmeticException("Negative bit address");
return (getInt(n >>> 5) & (1 << (n & 31))) != 0;
Java中BigDecimal和BigInteger用法知识点补充
今天开发过程中遇到了数据库字段的属性为BigDecimal
,对这个属性有点陌生,查看了下JavaAPI和阿里Java编码规范中和Mysql
建表约束中明确规范,写几个BigDecimal
类型的方法熟悉下用法,同时还遇到BigInteger
的用法,一起特此记录下!
BigDecimal
java.lang.Object
java.lang.Number
java.math.BigDecimal
BigDecimal
可以表示一个任意大小且精度完全准确的浮点数
public static void main(String[] args)
BigDecimal bigDecimal = new BigDecimal("-15896.789");
// 返回一个 BigDecimal ,其值为此 BigDecimal的绝对值
System.out.println("bigDecimal = " + bigDecimal);
// 转换为short:shortValue()
System.out.println("bigDecimal.shortValue() = " + bigDecimal.shortValue());
// 转换为int:intValue()
System.out.println("bigDecimal.intValue() = " + bigDecimal.intValue());
// 转换为byte:byteValue()
System.out.println("bigDecimal.byteValue() = " + bigDecimal.byteValue());
// 转换为float:floatValue()
System.out.println("bigDecimal.floatValue() = " + bigDecimal.floatValue());
// 转换为double:doubleValue()
System.out.println("bigDecimal.doubleValue() = " + bigDecimal.doubleValue());
// 转换为long:longValue()
System.out.println("bigDecimal.longValue() = " + bigDecimal.longValue());
System.out.println("bigDecimal.max(bigDecimal) = " + bigDecimal.max(bigDecimal));
// 返回此BigDecimal对象的精度
System.out.println("bigDecimal.scale() = " + bigDecimal.scale());
// 转为字符串
System.out.println("bigDecimal.toString() = " + bigDecimal.toString());
// 返回一个 BigDecimal ,相当于这个小数点,向左移动了 n个地方
System.out.println("bigDecimal.movePointLeft(2) = " + bigDecimal.movePointLeft(2));
// 返回一个 BigDecimal ,相当于这个小数点,向右移动了 n个地方
System.out.println("bigDecimal.movePointRight(2) = " + bigDecimal.movePointRight(2));
// 返回 BigDecimal ,值为 bigDecimal的平方
System.out.println("bigDecimal.multiply(bigDecimal) = " + bigDecimal.multiply(bigDecimal));
// 返回 BigDecimal ,值为 bigDecimal+bigDecimal
System.out.println("bigDecimal.add(bigDecimal) = " + bigDecimal.add(bigDecimal));
控制台输出
bigDecimal = -15896.789
bigDecimal.shortValue() = -15896
bigDecimal.intValue() = -15896
bigDecimal.byteValue() = -24
bigDecimal.floatValue() = -15896.789
bigDecimal.doubleValue() = -15896.789
bigDecimal.longValue() = -15896
bigDecimal.max(bigDecimal) = -15896.789
bigDecimal.scale() = 3
bigDecimal.toString() = -15896.789
bigDecimal.movePointLeft(2) = -158.96789
bigDecimal.movePointRight(2) = -1589678.9
bigDecimal.multiply(bigDecimal) = 252707900.510521
bigDecimal.add(bigDecimal) = -31793.578
BigInteger
java.lang.Object
java.lang.Number
java.math.BigInteger
BigInteger提供了所有Java的原始整数运算符和java.lang.Math中所有相关方法的类比。 此外,BigInteger还提供了模数运算,GCD计算,原始测试,初级生成,位操作以及其他一些其他操作的操作。
java.math.BigInteger
就是用来表示任意大小的整数。BigInteger
内部用一个int[]
数组来模拟一个非常大的整数
BigInteger
的构造方法
如果BigInteger
表示的范围超过了基本类型的范围,在转换时如果超出范围,将直接抛出ArithmeticException
异常
public static void main(String[] args)
BigInteger bigInteger = new BigInteger("1234566666");
BigInteger bigInteger1 = new BigInteger("123467896666");
BigInteger bigInteger2 = new BigInteger("789412354666");
BigInteger bigInteger3 = new BigInteger("12966600000");
System.out.println("bigInteger.pow(5) = " + bigInteger.pow(5));
System.out.println("bigInteger1.add(bigInteger2) = " + bigInteger1.add(bigInteger2));
// 转换为short:shortValue()
System.out.println("bigInteger3.shortValue() = " + bigInteger3.shortValue());
// 转换为int:intValue()
System.out.println("bigInteger3.intValue() = " + bigInteger3.intValue());
// 转换为float:floatValue()
System.out.println("bigInteger3.floatValue() = " + bigInteger3.floatValue());
// 转换为double:doubleValue()
System.out.println("bigInteger3.doubleValue() = " + bigInteger3.doubleValue());
// 转换为byte:byteValue()
System.out.println("bigInteger3.byteValue() = " + bigInteger3.byteValue());
// 转换为long:longValue()
System.out.println("bigInteger3.longValue() = " + bigInteger3.longValue());
// 如果`BigInteger`表示的范围超过了基本类型的范围,
// 在转换时如果超出范围,将直接抛出`ArithmeticException`异常
System.out.println("(bigInteger3.multiply(bigInteger3).longValueExact()) = " + (bigInteger3.multiply(bigInteger3).longValueExact()));
控制台输出
bigInteger.pow(5) = 2867957643217673649618338593780775741137020576
bigInteger1.add(bigInteger2) = 912880251332
bigInteger3.shortValue() = -25280
bigInteger3.intValue() = 81698112
bigInteger3.floatValue() = 1.29665997E10
bigInteger3.doubleValue() = 1.29666E10
bigInteger3.byteValue() = 64
bigInteger3.longValue() = 12966600000
Exception in thread "main" java.lang.ArithmeticException: BigInteger out of long range
小结
-
BigDecimal
用于表示精确的小数 -
比较
BigDecimal
的值是否相等,必须使用compareTo()
而不能使用equals()
-
BigInteger
表示任意大小的整数 -
将
BigInteger
转换为基本类型可使用longValueExact()
等方法保证结果准确
参考资料
BigInteger
以上是关于java中BigInteger用法的详解的主要内容,如果未能解决你的问题,请参考以下文章
Java中BigDecimal和BigInteger用法知识点补充