今天检查代码,发现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)就没有问题,所以我们必须指定小数位数。
网友评论