浅析java中的BigDecimal

来源:互联网 发布:俄罗斯战斗民族知乎 编辑:程序博客网 时间:2024/06/01 09:14
在精确小数运算中,经常会用到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;

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

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

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

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

@Rulepublic ExpectedException thrown= ExpectedException.none();@Testpublic 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));}@Testpublic 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进行计算。

原创粉丝点击