java.math.BigDecimal的BUG——正确四舍五入保留n位小数

写了一个业务其中包括个税计算的,哗啦啦一大片计算完,合计就差0.04。

两个原因造就这个问题。

问题一,后台程序拿到税前工资是一个计算后的double数值(12521.7391),然后用此值来计算个税。

而导出Excel后验证个税时,税前工资已经两位小数化(12521.74),用此值来计算导致误差。

原以为这样就结束了,没想到修改完还是有误差存在,由此引发了第二个问题!

问题二,java.math.BigDecimal的BUG!

有兴趣的同学可以试一下下面的程序打印出什么?

double tmp = 1025.435;
BigDecimal t2 = new BigDecimal(tmp).setScale(2,BigDecimal.ROUND_HALF_UP);

System.out.println(t2);
double doubleValue = t2.doubleValue();
System.out.println(doubleValue);

结果是 1025.43 !

百思不得其解,试了很多次,有时末位是5会进位,但大多数时候不会进位。心想BigDecimal不能用,难道要我自己写一个四舍五入的函数?java也没有提供其它的保留小数位数并四舍五入的api啊。

后来看了一篇博文才知道:

// BigDecimal方式
double f = 1025.435;
BigDecimal b = new BigDecimal(new Double(f).toString);
double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();


注意:这里一定不要直接使用new BigDecimal(double)的构造方法,
而要使用new BigDecimal(new Double(1025.435).toString())的方式,不然会出现精确问题

推荐博文:java中的四舍五入——几种四舍五入的写法

https://blog.csdn.net/w1014074794/article/details/53640731

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值