概述
Java中的超大数BIgInteger和BigDecimal
在我们处理大位数运算的时候,我们经常用的int和long类型的数已经不能够满足我们的运算了,那么这个时候就需要用到一个超大数来运算,这个时候我们会用到java.math.BigInteger,当然如果我们要对多位数的小数进行运算那么这个时候就需要用到java.math.BigDecimal ,这两个都是用于高精度的计算,BigInteger针对于整形大数字的处理,BigDecimal 针对大小数的处理类。
在我们做算法的时候经常会碰到超大数的运算,那么这个时候integer显然是已经不够用的了,所以Java提供了BigInteger来处理更大的数字,平常的int存储的数字位数为2的31次方减1,而超大数可以计算的数字位数超过了上千位,所以 处理我们在运算过程中的数据轻轻松松。
使用超大数
因为超大数是Java的一个类,所以我们需要引入这个类型的包名。一般情况下,我们在使用的时候可以自动导入包名,当然你也可以自己导入包名。
import java.math.BigInteger;
导入了包我么就可以拿来使用了,
我们在使用的时候就可以声明一下,创建对象。
方式一:直接声明 并且赋值
BigInteger a = new BigInteger("123456789") ; // 声明BigInteger对象但是参数是字符串
BigInteger b =BigInteger.valueOf(123456789) ; // 声明BigInteger对象参数是int和log
方式二:直接声明,读入数据
Scanner cin = new Scanner(System.in); //相当于C++中的cin,只不过这个cin需要自己创建
BigInteger a;
a = cin.nextBigInteger(); //读入一个BigInteger;
BigInteger 类使用方法
因为BigInteger 是一个类,Java本身封装了许多的常用方法,比如,四则运算还有求绝对值、相反数、最大公约数以及判断是否为质数等。
下表是其本身就具有的一些方法,大家在使用的时候可以参考这些方法如何使用。
方法名称 | 使用说明 |
---|---|
add(BigInteger val) | 做加法运算 |
subtract(BigInteger val) | 做减法运算 |
multiply(BigInteger val) | 做乘法运算 |
divide(BigInteger val) | 做除法运算 |
remainder(BigInteger val) | 做取余数运算 |
divideAndRemainder(BigInteger val) | 做除法运算,返回数组的第一个值为商,第二个值为余数 |
pow(int exponent) | 做参数的 exponent 次方运算 |
negate() | 取相反数 |
shiftLeft(int n) | 将数字左移 n 位,如果 n 为负数,则做右移操作 |
shiftRight(int n) | 将数字右移 n 位,如果 n 为负数,则做左移操作 |
and(BigInteger val) | 做与运算 |
or(BigInteger val) | 做或运算 |
compareTo(BigInteger val) | 做数字的比较运算 |
equals(Object obj) | 当参数 obj 是 Biglnteger 类型的数字并且数值相等时返回 true, 其他返回 false |
min(BigInteger val) | 返回较小的数值 |
max(BigInteger val) | 返回较大的数值 |
代码示例:
public class BigIntegerDemo1 {
public static void main(String[] args) {
BigInteger a = new BigInteger("123456789") ; // 声明BigInteger对象但是参数是字符串
BigInteger b =BigInteger.valueOf(987654321) ; // 声明BigInteger对象参数是int和log
//四则运算
//加法操作
System.out.println("加法操作:" + a.add(b)) ;
//减法操作
System.out.println("减法操作:" + a.subtract(b)) ;
//乘法操作
System.out.println("乘法操作:" + a.multiply(b)) ;
//除法操作
System.out.println("除法操作:" + a.divide(b)) ;
//比较大小
System.out.println("结果:" + a.equsals(b)) ;//如果a、b相等返回true否则返回false
System.out.println("结果:" + a.compareTo(b)); //a小于b返回-1,等于返回0,大于返回1
//常用计算方法
//取余
System.out.println("取余:" + a.mod(b)) ;
//求最大公因数
System.out.println("最大公因数:" + a.gcd(b)) ;
//求最大值
System.out.println("最大值:" + a.max(b)) ;
//求最小值
System.out.println("最小值:" + a.min(b)) ;
//求大整数的位数
//先转换成字符串再求字符串的长度
System.out.println("长度:" + a.toString().length()) ;
}
}
以下诸如此类,大家可以类比着使用。
BigDecimal 类使用方法
使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
BigDecimal 常用的构造方法如下
- BigDecimal(int val):创建一个具有参数所指定整数值的对象
- BigDecimal(double):创建一个具有参数所指定双精度值的对象
- BigDecimal(long):创建一个具有参数所指定长整数值的对象
- BigDecimal(String):创建一个具有参数所指定以字符串表示的数值的对象
BigDecimal 类使用方法和BigInteger类似,不过多赘述。
BigDecimal 类适用Big Integer的加减乘除等运算但BigDecimal 也有自己的处理小数的方式
下表是BigDecimal 类的处理方式
模式名称 | 说明 |
---|---|
BigDecimal.ROUND_UP | 商的最后一位如果大于 0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字都省略 |
BigDecimal.ROUND_CEILING | 商如果是正数,按照 ROUND_UP 模式处理;如果是负数,按照 ROUND_DOWN 模式处理 |
BigDecimal.ROUND_FLOOR | 与 ROUND_CELING 模式相反,商如果是正数,按照 ROUND_DOWN 模式处理; 如果是负数,按照 ROUND_UP 模式处理 |
BigDecimal.ROUND_HALF_ DOWN | 对商进行五舍六入操作。如果商最后一位小于等于 5,则做舍弃操作,否则对最后 一位进行进位操作 |
BigDecimal.ROUND_HALF_UP | 对商进行四舍五入操作。如果商最后一位小于 5,则做舍弃操作,否则对最后一位 进行进位操作 |
BigDecimal.ROUND_HALF_EVEN | 如果商的倒数第二位是奇数,则按照 ROUND_HALF_UP 处理;如果是偶数,则按 照 ROUND_HALF_DOWN 处理 |
代码示例:
import java.math.BigDecimal;
public class BigD{
public static void main(String[] args) {
// 保存用户输入的数字
double num = 1211.31354645;
// 使用输入的数字创建BigDecimal对象
BigDecimal bd = new BigDecimal(num);
// 计算大数字加上56.789的结果
System.out.println("加法操作结果:" + bd.add(new BigDecimal(56.789)));
// 计算大数字减去-56.456789的结果
System.out.println("减法操作结果:" + bd.subtract(new BigDecimal(-56.456789)));
// 计算大数字乘以5.5的结果
System.out.println("乘法操作结果:" + bd.multiply(new BigDecimal(5.5)));
// 计算大数字除以3.14的结果,并保留小数后2位
System.out.println("除法操作结果(保留 2 位小数):" + bd.divide(new BigDecimal(3.14), 2, BigDecimal.ROUND_CEILING));
// 计算大数字除以3.14的结果,并保留小数后5位
System.out.println("除法操作结果(保留 5 位小数):" + bd.divide(new BigDecimal(3.14), 5, BigDecimal.ROUND_CEILING));
}
}
以上详情内容参考Java大数字运算
大数类运算
最后
以上就是任性钢笔为你收集整理的Java大数字运算(BigInteger类和BigDecimal类)的全部内容,希望文章能够帮你解决Java大数字运算(BigInteger类和BigDecimal类)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复