我是靠谱客的博主 大方煎饼,最近开发中收集的这篇文章主要介绍浅析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进行计算。

最后

以上就是大方煎饼为你收集整理的浅析java中的BigDecimal的全部内容,希望文章能够帮你解决浅析java中的BigDecimal所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部