Double转BigDecimal进行四舍五入操作时会出现数据损失

工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用BigDecimal转换时根本不是想像中的那么简单。看代码:

java.math.BigDecimal bd = new java.math.BigDecimal(115.5225);//这里将浮点数转化为BigDecimal
Double d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();//四舍五入,保留3位小数
System.out.println("BigDecimal : " + bd  + " d : " + d);//输出BigDecimal和四舍五入后的数

输出结果
BigDecimal : 115.5224999999999937472239253111183643341064453125 d : 115.522

发现问题没有?115.5225四舍五入后照理应该是115.523,但是转换为BigDecimal后再处理就不对了。有点儿小邪门儿。
还有更邪门儿的,再试试下面这个:

bd = new java.math.BigDecimal(8.7225);//结尾同样是225
d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();//同样四舍五入,保留3为小数
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果
BigDecimal : 8.722500000000000142108547152020037174224853515625 d : 8.723

这里最终结果就是我们想要的结果,是可以正常四舍五入。


你应该已经发现了,是BigDecimal在搞鬼。我给的是常量啊,难道115.5225就天生8.7225比要低一等?凭什么啊!!这tm让我咋整啊??
这儿有一个坏消息和一个好消息,你听哪一个?
额……坏消息是:我tm也不知道为毛BigDecimal这儿调皮,这么喜欢搞歧视。
好消息是:我已经找到了解决方案——等灯等灯

java.math.BigDecimal bd = new java.math.BigDecimal("115.5225");//用字符串来转为BigDecimal 就不调皮了
Double d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果
BigDecimal : 115.5225 d : 115.523

bd = new java.math.BigDecimal("8.7225");
d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果
BigDecimal : 8.7225 d : 8.723


BigDecimal 终于服服帖帖不调皮了
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值