BigDecimal:用于精确计算的类
构造方法
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
2、BigDecimal 做除法结果为无限小数:
- public BigDecimal divide(BigDecimal divisor):不设置结果的精度,报错,抛出 java.lang.ArithmeticException 异常
- public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):设置了结果的精度和舍入方式,正常
```java
// BigDecimal做除法时出现除不尽时会报错 java.lang.ArithmeticException
System.out.println(new BigDecimal(30).divide(new BigDecimal(7)));
// 除不尽时可以设置余数的精度
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 方法(忽略精度)