BigDecimal 的基本使用

4 篇文章 0 订阅

为什么要使用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类型的小数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值