BigDecimal

BigDecimalscale()表示小数位数,例如:

  1. BigDecimal d1 = new BigDecimal("123.45");
  2. BigDecimal d2 = new BigDecimal("123.4500");
  3. System.out.println(d1.scale()); // 2,两位小数
  4. System.out.println(d2.scale()); // 4
  5. System.out.println(d3.scale()); // 0

通过BigDecimalstripTrailingZeros()方法,可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal

如果一个BigDecimalscale()返回负数,例如,-2,表示这个数是个整数,并且末尾有2个0。

可以对一个设置它的scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断:

  1. BigDecimal d1 = new BigDecimal("123.456");
  2. BigDecimal d2 = new BigDecimal("23.456789");
  3. BigDecimal d4 = d1.divide(d2); // 报错:ArithmeticException,因为除不尽

还可以对BigDecimal做除法的同时求余数:

BigDecimal - 图1

调用divideAndRemainder()方法时,返回的数组包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。我们可以利用这个方法判断两个BigDecimal是否是整数倍数:

在比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等:

  1. BigDecimal d1 = new BigDecimal("123.456");
  2. BigDecimal d2 = new BigDecimal("123.45600");
  3. System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0后scale变为2

必须使用compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。

如果查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:

BigDecimal也是从Number继承的,也是不可变对象。

BigDecimal用于表示精确的小数,常用于财务计算;

比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()

BigDecimal - 图2