避坑-数值计算精度

数值计算,特别是金额的计算,在金融项目中非常常见,平常我们可能会注意,对于除数的操作,可能会留意是否能够整除,是否需要保留几位小数,但是对于常见的加、减、乘我们是否也要注意小数的问题呢?
先看下面的例子:
System.out.println("0.1 + 0.2 = " + (0.1 + 0.2));
System.out.println("1 - 0.8 = " + (1 - 0.8));
System.out.println("1.015 * 100 = " + (1.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
执行结果:

0.1 + 0.2 = 0.30000000000000004
1 - 0.8 = 0.19999999999999996
1.015 * 100 = 101.49999999999999
123.3 / 100 = 1.2329999999999999
是不是和我们想的不是很一样?
这时有同学会想到,这种情况要用BigDecimal类来解决
例如:

System.out.println("new BigDecimal(0.1).add(new BigDecimal(0.2)=" + new BigDecimal(0.1).add(new BigDecimal(0.2)));
System.out.println("new BigDecimal(1).subtract(new BigDecimal(0.8))=" + new BigDecimal(1).subtract(new BigDecimal(0.8)));

执行结果:
new BigDecimal(0.1).add(new BigDecimal(0.2)=0.3000000000000000166533453693773481063544750213623046875
new BigDecimal(1).subtract(new BigDecimal(0.8))=0.1999999999999999555910790149937383830547332763671875

怎么还不行?这就需要看源码了
源码如下:如果传入的是小数,则会当做double 类型处理,精度没有限制
    public BigDecimal(double val) {
        this(val,MathContext.UNLIMITED);
    }
所以我们要用它的重载方法,即可解决:

  public BigDecimal(String val) {
        this(val.toCharArray(), 0, val.length());
    }


小数计算修改为下面即可:

System.out.println("new BigDecimal(\"0.1\").add(new BigDecimal(\"0.2\"))=" + new BigDecimal("0.1").add(new BigDecimal("0.2")));

new BigDecimal("0.1").add(new BigDecimal("0.2"))=0.3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值