BigDecimal:用于精确计算的类

image.png

构造方法

BigDecimal 有四个构造方法:

  • BigDecimal(int):精度为 0
  • BigDecimal(double):不确定,为近似值的小数点后位数
    • new BigDecimal(0.1) 创建一个 BigDecimal 时,创建出来的值并不是正好等于 0.1 的,而是一个近似值,因此精度就是这个近似值的位数
  • BigDecimal(long):精度为 0
  • BigDecimal(String):精度为传入字符串小数点后的位数
    • new BigDecimal(“0.1”) 创建一个 BigDecimal 时,其创建出来的值恰好等于 0.1,则此时精度为 1

以上四个构造方法,创建出来的 BigDecimal 对象的精度是不同的。创建小数时,最好使用字符串进行参数传入。

BigDecimal 的精度问题

1、设置 BigDecimal 的精度:

  • public BigDecimal setScale(int newScale):只能设置比原 BigDecimal 的精度大,否则抛出 java.lang.ArithmeticException 异常
  • public BigDecimal setScale(int newScale, int roundingMode):可以随意设置精度,roundingMode 指定舍入的方式 ```java BigDecimal decimal = new BigDecimal(“12.222”); // 设置精度只能比原精度大,否则抛出 java.lang.ArithmeticException 异常 // 上述 12.222 的精度为 3,因此设置精度时必须大于等于 3 BigDecimal other = decimal.setScale(3); System.out.println(other); // 12.222

// 设置精度时进行四舍五入 BigDecimal decimal1 = decimal.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(decimal1); // 12.22

  1. 2BigDecimal 做除法结果为无限小数:
  2. - public BigDecimal divide(BigDecimal divisor):不设置结果的精度,报错,抛出 java.lang.ArithmeticException 异常
  3. - public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):设置了结果的精度和舍入方式,正常
  4. ```java
  5. // BigDecimal做除法时出现除不尽时会报错 java.lang.ArithmeticException
  6. System.out.println(new BigDecimal(30).divide(new BigDecimal(7)));
  7. // 除不尽时可以设置余数的精度
  8. System.out.println(new BigDecimal(30).divide(new BigDecimal(7),2,BigDecimal.ROUND_HALF_UP));

结论:在使用 BigDecimal 参与除法运算时,一定要设置结果的精度,避免出现错误
**

BigDecimal 的比较

BigDecimal decimal1 = new BigDecimal(1);
BigDecimal decimal2 = new BigDecimal(“1.0”);

BigDecimal 有三种比较方式:

  • decimal1 == decimal2:BigDecimal 为实例对象,等号运算符比较的是对象引用的地址,因此返回 false
  • decimal1.equals(decimal2):BigDecimal 的 equals 方法会比较两方面内容,分别是值(value)和精度(scale),decimal1 的精度为 0,而 decimal2 的精度为 1,因此返回 false
  • decimal1.compareTo(decimal2):BigDecimal 的 compareTo 方法会忽略精度,仅仅比较值的大小,因此返回 0

注意事项:BigDecimal 的比较应该使用 compareTo 方法(忽略精度)