在Java中提供了大数字的操作类,即java.math.BigInteger和java.math.BigDecimal类。这两个类用于高精度计算,其中BigInteger类针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。
一、BigInteger
BigInteger类型的数字范围较Integer类型的数字范围要大得多,BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息,语法如下:
public BigInteger(String val)
下面将列举几种BigInteger类中的常用运算方法:
1、public BigInteger add(BigInteger val):做加法运算
2、public BigInteger subtract(BigInteger val):做减法运算
3、public BigInteger multiply(BigInteger val):做乘法运算
4、public BigInteger divide(BigInteger val):做除法运算
5、public BigInteger remainder(BigInteger val):做取余运算
6、public BigInteger[] divideAndRemainder(BigInteger val):用数组返回余数和商,数组中第一个为商
7、public BigInteger pow(int exponent):进行取参数的exponent次方操作
8、public BigInteger negate():取相反数
9、public BigInteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作
10、public BigInteger shiftRight(int n):将数字右移n位,如果n为负数,做左移操作
11、public BigInteger and(BigInteger val):做与操作
12、public BigInteger or(BigInteger val):做或操作
13、public int compareTo(BigInteger val):做数字比较操作
14、public boolean equals(Object x):当参数x是BigInteger类型的数字并且数值相等时,返回true
15、public BigInteger min(BigInteger val):返回较小的值
16、public BigInteger max(BigInteger val):返回较大的值
通过以下示例对部分上述方法进行说明:
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String args[]) {
//实例化一个大数字
BigInteger bigInstance = new BigInteger("8");
System.out.println("该大数字为:"+bigInstance);
//取该大数字加2的操作
System.out.println("加2操作结果为:"+bigInstance.add(new BigInteger("2")));
//取该大数字减2的操作
System.out.println("减2操作结果为:"+bigInstance.subtract(new BigInteger("2")));
//取该大数字乘2的操作
System.out.println("乘2操作结果为:"+bigInstance.multiply(new BigInteger("2")));
//取该大数字除以2的操作
System.out.println("除以2操作结果为:"+bigInstance.divide(new BigInteger("2")));
//取该大数字除以3的商
System.out.println("除以3的商:"+bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
//取该大数字除以3的余数
System.out.println("除以3的余数:"+bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
//取该大数字的2次方
System.out.println("该大数字的2次方结果为:"+bigInstance.pow(2));
//取该大数字的相反数
System.out.println("该大数字的相反数为:"+bigInstance.negate());
}
}
/*输出结果为:
该大数字为:8
加2操作结果为:10
减2操作结果为:6
乘2操作结果为:16
除以2操作结果为:4
除以3的商:2
除以3的余数:2
该大数字的2次方结果为:64
该大数字的相反数为:-8
*/
二、BigDecimal
在BigDecimal类中常用的两个构造方法如下:
1、public BigDecimal(double val):实例化时将双精度型转换为BigDecimal类型
2、public BigDecimal(String val):实例化时字符串类型转换成BigDecimal类型
下面例举BigDecimal类中实现加、减、乘、除的方法:
1、public BigDecimal add(BigDecimal augend):做加法操作
2、public BigDecimal subtract(BigDecimal subtrahend):做减法操作
3、public BigDecimal multiply(BigDecimal multiplicand):做乘法操作
4、public BigDecimal divide(BigDecimal divisor,int scale,inr roundingMode):做除法操作,三个参数分别是除数、商的小数点后的位数、近似处理模式
在上述方法中,divide()方法有多种设置,如下:
模式 | 含义 |
---|---|
BigDecimal.ROUND_UP | 商的最后一位如果大于0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字都省略 |
BigDecimal.ROUND_CEILING | 商如果是正数,按照ROUND_UP模式处理;如果是负数,按照ROUND_DOWN模式 处理。这种模式处理都会使近似值大于等于实际值 |
BigDecimal.ROUND_FLOOR | 商如果是负数,按照ROUND_UP模式处理;如果是正数,按照ROUND_DOWN模式 处理。这种模式处理都会使近似值小于等于实际值 |
BigDecimal.ROUND_HALF_DOWN | 对商进行四舍五入操作,如果最后一位小于等于5,则做舍弃操作 |
BigDecimal.ROUND_HALF_UO | 对商进行四舍五入操作,如果最后一位小于5,则做舍弃操作 |
BigDecimal.ROUND_HALF_EVEN | 如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果为偶数,则按照ROUND_HALF_DOWN处理 |
通过下面的示例对上述的方法进行说明:
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
/*
* 定义加法方法,参数为加数与被加数
*
* @param value1:被加数
* @param value2:加数
* @return:运算结果
* */
public BigDecimal add(double value1,double value2) {
//实例化Decimal对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用加法方法
return b1.add(b2);
}
/*
* 定义减法方法,参数为减数与被减数
*
* @param value1:被减数
* @param value2:减数
* @return:运算结果
* */
public BigDecimal sub(double value1,double value2) {
//实例化Decimal对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用减法方法
return b1.subtract(b2);
}
/*
* 定义乘法方法,参数为乘数与被乘数
*
* @param value1:第一个乘数
* @param value2:第二个乘数
* @return:运算结果
* */
public BigDecimal mul(double value1,double value2) {
//实例化Decimal对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用乘法方法
return b1.multiply(b2);
}
/*
* 定义除法方法,参数为除数与被除数
*
* @param value1:被除数
* @param value2:除数
* @return:运算结果
* */
public BigDecimal div(double value1,double value2) {
//调用自定义除法方法
return div(value1,value2,location);
}
//定义除法方法,参数分别是除数与被除数以及商小数点后的位数
public BigDecimal div(double value1,double value2,int b) {
if(b<0) {
System.out.println("b值必须大于等于0!");
}
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用除法方法,商小数点后保留b位,并将结果进行四舍五入操作
return b1.divide(b2,b,BigDecimal.ROUND_HALF_UP);
}
public static void main(String args[]) {
BigDecimalDemo b =new BigDecimalDemo();
System.out.println("-7.5+8.9结果:"+b.add(-7.5, 8.9));
System.out.println("-7.5-8.9结果:"+b.sub(-7.5, 8.9));
System.out.println("-7.5x8.9结果:"+b.mul(-7.5, 8.9));
System.out.println("23÷2,结果保留小数后10位:"+b.div(23, 2));
System.out.println("-7.5÷8.9,结果保留小数后5位:"+b.div(-7.5, 8.9,5));
}
}
/*输出结果如下:
-7.5+8.9结果:1.4
-7.5-8.9结果:-16.4
-7.5x8.9结果:-66.75
23÷2,结果保留小数后10位:11.5000000000
-7.5÷8.9,结果保留小数后5位:-0.84270
*/