为什么要使用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类型的小数

版权声明:本文为m0_50163856原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_50163856/article/details/128911819