BigInteger和BigDecimal类
如果要进行非常大的数的计算或者高精度的浮点值的计算,可以使用java.math包中的BigInteger类和BigDecimal类。他们都是不可变的,都扩展自Number类,实现Comparable接口。BigInteger的实例可以表示任意大小的整数,可以通过new BigInteger和BigDecimal类来创建BigInteger和BigDecimal类的实例,使用add,subtract,multiple 和 remainder 方法完成算数运算。
特别注意:传入的参数是String类型
BigInteger类:
BigInteger num1 = new BigInteger("100");
BigInteger num2 = new BigInteger("2");
System.out.println(num1.add(num2));
结果:
102
BigDecimal类:
BigDecimal 的对象的精度没有限制,如果结果不能终止,那么divide方法会抛出ArithmeticException异常。但是可以通过重载divide(BigDecimal num,int scale,int roundingMode)方法来指定尺度和舍入方式来避免异常,这里的scale 是指小数点后最小的整数位数。
BigDecimal num1 = new BigDecimal("1.0");
BigDecimal num2 = new BigDecimal("3");
System.out.println(num1.divide(num2));
结果:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
at com.sxt0425.test01.main(test01.java:32)
改进:创建两个尺度为20,舍入方式为BigDecimal.ROUND_UP的BigDecimal对象
BigDecimal num1 = new BigDecimal("1.0");
BigDecimal num2 = new BigDecimal("3");
//重载divide(BigDecimal num,int scale,int roundingMode)
System.out.println(num1.divide(num2,20,BigDecimal.ROUND_UP));
结果:
0.33333333333333333334