浅析java中的BigDecimal

在精确小数运算中,经常会用到java.math.BigDecimal这个类,那么BigDecimal到底能参与多大范围的数字间的运算呢,查看BigDecimal的注释:

注释

意思就是一个Bigdecimal是任意精度的 整数非标度值和32位标度值组成,那么BigDecimal的最大值,以及最大小数位到底可以是多少呢。通过查看源码可以看到

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    /**
     * The unscaled value of this BigDecimal
     */
    private final BigInteger intVal;
    /**
     * The scale of this BigDecimal.
     */
    private final int scale; 
    ...
}

也就是说一个BigDecimal表示的数字实际上是由BigInteger 来表示这个数字的值,int 来表示有多少个小数位,
比如:
intVal = 1000;
scale = 1;

@Test
public void testVal(){
    BigDecimal bigDecimal2 = new BigDecimal(new BigInteger("1000"), 1);
    System.out.println(bigDecimal2);
}

那么这个数字的值实际上是100.0;

所以Bigdecimal能表示的最大整数应该是Biginteger的最大值
最多能有Integer.MAX_VALUE个小数位

另外在利用Bigdecimal做除法时,如果遇到除不尽的情况下,如果不指定精度会抛出异常。

@Rule
public ExpectedException thrown= ExpectedException.none();

@Test
public void testDivide(){
    BigDecimal ten = new BigDecimal("10");
    BigDecimal three = new BigDecimal("3");
    thrown.expect(ArithmeticException.class);
    thrown.expectMessage("Non-terminating decimal expansion; " +
                                             "no exact representable decimal result.");
    System.out.println(ten.divide(three));
}
@Test
public void testDivide2(){
    BigDecimal ten = new BigDecimal("10");
    BigDecimal three = new BigDecimal("3");
    System.out.println(ten.divide(three,10,RoundingMode.HALF_UP)); //保留10位小数进行四舍五入
}

此外在运算上面,Bigdecimal会根据数值大小来决定是否使用long值做计算,如果数值比较大才会使用BigInteger进行计算。

猜你喜欢

转载自blog.csdn.net/m0_38043362/article/details/78049655