为什么要使用BigDecimal
举一组简单的例子:
public static void main(String[] args) {
System.out.println(0.1 + 0.2);
BigDecimal addend = new BigDecimal("0.1");
BigDecimal augend = new BigDecimal("0.2");
System.out.println(addend.add(augend).doubleValue());
}
0.30000000000000004
0.3
Process finished with exit code 0
通过这段代码发现,使用运算符+得到的接口竟然是错的。
这是因为程序在运算时会把0,1和0.2先转换成二进制在进行相加,得到的结果在转换成十进制,在转换的过程中会发生精度丢失。
BigDecimal 就是为了解决这一问题出现的。
BigDecimal 是使用
BigDecimal 的构造方法
- public BigDecimal(String val)
- public BigDecimal(double val)
- public BigDecimal(BigInteger val)
- public BigDecimal(int val)
- public BigDecimal(long val)
推荐public BigDecimal(String val)
因为:
public static void main(String[] args) {
BigDecimal addend1 = new BigDecimal("0.1");
BigDecimal augend1 = new BigDecimal("0.2");
System.out.println(addend1.add(augend1));
BigDecimal addend2 = new BigDecimal(0.1);
BigDecimal augend2 = new BigDecimal(0.2);
System.out.println(addend2.add(augend2));
}
0.3
0.3000000000000000166533453693773481063544750213623046875
Process finished with exit code 0
new BigDecimal(0.1)的0.1其实是0.1000000000000000055511151231257827021181583404541015625,0.1无法准确地表示为double。
new BigDecimal(“0.1”)的0.1才真正是0.1。
BigDecimal 的常用方法
运算方法
方法 | 说明 |
---|---|
public BigDecimal add(BigDecimal augend) | 加法 |
public BigDecimal subtract(BigDecimal subtrahend) | 减法 |
public BigDecimal multiply(BigDecimal multiplicand) | 乘法 |
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 除法 |
四个运算方法的返回值均为BigDecimal;
除法可能会除不尽,所以需要传入保留小数点的位数和舍入模式
舍入模式枚举 | 说明 |
---|---|
RoundingMode.UP | 远离的零方向舍入的舍入模式 |
RoundingMode.DOWN | 向零的方向舍入的舍入模式 |
RoundingMode.CEILING | 向上取整。 向正无限大的方向舍入的舍入模式 |
RoundingMode.FLOOR | 向下取整。向负无限大的方向舍入的舍入模式 |
RoundingMode.HALF_UP | 四舍五入。向最接近数字的方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入 |
RoundingMode.HALF_DOWN | 向最接近数字的方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入 |
RoundingMode.HALF_EVEN | 向最接近数字的方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入 |
RoundingMode.UNNECESSARY | 用于断言请求的操作具有精确结果的舍入模式 |
比较方法
方法 | 说明 |
---|---|
public BigDecimal min(BigDecimal val) | 返回较小的 |
public BigDecimal max(BigDecimal val) | 返回较大的 |
public int compareTo(BigDecimal val) | -1-小于;0-等于;1-大于 |
public boolean equals(Object x) | 值和比例都等于时才会返回true |
转换方法
方法 | 说明 |
---|---|
public BigDecimal stripTrailingZeros() | 去掉小数末尾的0 |
public String toString() | 返回数值字符串。可能会使用科学计数法 |
public String toEngineeringString() | 返回数值字符串。可能会使用工程计数法 |
public String toPlainString() | 返回数值字符串。一定是数值完整的字符串 |
public long longValue() | 返回long类型的整数 |
public int intValue() | 返回int类型的整数 |
public float floatValue() | 返回float类型的小数 |
ppublic double doubleValue() | 返回double类型的小数 |