BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。
参考资料:李兴华java视频讲解
BigDecimal:可以精确地表示任意精度的小数,同时在运算过程中不会丢失任何信息,并且可以指定保留的小数位数,进行精确的四舍五入
这两个类都位于java.math包中
一.BigInteger类
正常情况下一个整数最多只能放在long类型中,但是如果出现如:123455555555555555555555522222222这么大的数根本无法保存,所以为了解决这样的问题,java中引入了操作大数的操作类
*操作整数:BigInteger
*操作小数:BigDecimal
BigInteger类中的部分方法:
import java.math.BigInteger;
public class BigIntegerDemo01{
public static void main(String[] args){
BigInteger bi1 = new BigInteger("123456789");
BigInteger bi2 = new BigInteger("987654321");
System.out.println("加法操作:"+bi2.add(bi1));
System.out.println("减法操作:"+bi2.subtract(bi1));
System.out.println("乘法操作:"+bi2.multiply(bi1));
System.out.println("除法操作:"+bi2.divide(bi1));
System.out.println("求最大值:"+bi2.max(bi1));
System.out.println("求最小值:"+bi2.min(bi1));
}
}
可以看到上面的除法操作也不是精确的,所以可以使用BigInteger中的divideAndRemainder()方法
import java.math.BigInteger;
public class BigIntegerDemo01{
public static void main(String[] args){
BigInteger bi1 = new BigInteger("123456789");
BigInteger bi2 = new BigInteger("987654321");
System.out.println("加法操作:"+bi2.add(bi1));
System.out.println("减法操作:"+bi2.subtract(bi1));
System.out.println("乘法操作:"+bi2.multiply(bi1));
System.out.println("求最大值:"+bi2.max(bi1));
System.out.println("求最小值:"+bi2.min(bi1));
BigInteger result[] = bi2.divideAndRemainder(bi1);
System.out.println("除法操作:"+"商等于:"+result[0]+"余数等于:"+result[1]);
}
}
二.BigDecimal类
BigDecimal方法也位于java.math包中
public class BigDecimal extends Number implements Comparable<BigDecimal>
其中,BigDecimal类中还有方法public double doubleValue() 将此 BigDecimal 转换为 double
下面看一下利用BigDecimal进行运算:
import java.math.BigDecimal;
class MyMath{
public static double add(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
public static double sub(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double mul(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
}
public class BigDecimalDemo{
public static void main(String[] args){
System.out.println("加法运算:"+MyMath.add(10.345,3.333));
System.out.println("减法运算:"+MyMath.sub(10.345,3.333));
System.out.println("乘法运算:"+MyMath.mul(10.345,3.333));
}
}
这里没有做除法,因为除法要四舍五入,下面我们具体看一下:
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
import java.math.BigDecimal;
class MyMath{
public static double add(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
public static double sub(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double mul(double d1,double d2){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
public static double div(double d1,double d2,int len){
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double round(double d,int len){
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
public class BigDecimalDemo{
public static void main(String[] args){
System.out.println("加法运算:"+MyMath.round(MyMath.add(10.345,3.333),1));
System.out.println("减法运算:"+MyMath.round(MyMath.sub(10.345,3.333),3));
System.out.println("乘法运算:"+MyMath.round(MyMath.mul(10.345,3.333),4));
System.out.println("除法运算:"+MyMath.div(10.345,3.333,3));
}
}