工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用BigDecimal转换时根本不是想像中的那么简单。看代码:
输出结果
BigDecimal : 115.5224999999999937472239253111183643341064453125 d : 115.522
发现问题没有?115.5225四舍五入后照理应该是115.523,但是转换为BigDecimal后再处理就不对了。有点儿小邪门儿。
还有更邪门儿的,再试试下面这个:
输出结果
BigDecimal : 8.722500000000000142108547152020037174224853515625 d : 8.723
这儿有一个坏消息和一个好消息,你听哪一个?
额……坏消息是:我tm也不知道为毛BigDecimal这儿调皮,这么喜欢搞歧视。
好消息是:我已经找到了解决方案——等灯等灯
输出结果
BigDecimal : 115.5225 d : 115.523
输出结果
BigDecimal : 8.7225 d : 8.723
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
这里最终结果就是我们想要的结果,是可以正常四舍五入。
这儿有一个坏消息和一个好消息,你听哪一个?
额……坏消息是:我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 终于服服帖帖不调皮了