美文网首页
BigDecimal使用要点

BigDecimal使用要点

作者: 贾老师和他的朋友们 | 来源:发表于2018-09-15 14:58 被阅读51次

    今天检查代码,发现bigdecimal使用有错误,整理下,内部分享。

    一、为什么用Bigdecimal

    Java在直接进行浮点型运算时,比较容易出现精度丢失的问题,导致意料之外的运算结果;可以使用BigDecimal则提供的方法避免精度丢失。

    二、注意事项

    2.1、BigDecial是immutable的,就像String一样,它的所有操作都会生成一个新的对象,所以

     amount.add( thisAmount );

    是错误的;而应该是:

     amount = amount.add( thisAmount );

    2.2、不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;例如:

     BigDecimal a = new BigDecimal("2.00");

     BigDecimal b = new BigDecimal("2.0");

     print(a.equals(b)); // false

    所以你应该使用compareTo()和signum()方法

     a.compareTo(b);  // returns (-1 if a < b), (0 if a == b), (1 if a > b)

     a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)

    2.3、构造函数

    BigDecimal a=new  BigDecimal("2.1");

    BigDecimal b=new  BigDecimal(2.1);

    这两者是不同的,第一种推荐,因为结果是可知的;第二种,可能会出现2.099999999999999999999..这种double经常出现的问题。

    2.4、除法的用法,今天就出现这么一个exception,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

    我才检查代码.

    BigDecimal a = new BigDecimal("2.0");

    BigDecimal b = new BigDecimal("2");

    BigDecimal c = new BigDecimal("3");

    a.divide(b) 没有问题

    a.divide(c) 就会出现上面的异常。

    即出现无限小数就会异常,必须指定小数位数

    a.divide(c, 2)就没有问题,所以我们必须指定小数位数。

     

    相关文章

      网友评论

          本文标题:BigDecimal使用要点

          本文链接:https://www.haomeiwen.com/subject/uezzgftx.html