大家好,又见面了,我是你们的朋友全栈君。工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用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 终于服服帖帖不调皮了
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145867.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...