java保留小数点后四舍五入的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java保留小数点后四舍五入的问题相关的知识,希望对你有一定的参考价值。

        在Java中使用一些方法进行四舍五入会出现和预期不同的结果,这是因为这些方法使用的原则实际为:四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一。

        1.四舍六入五考虑时出现五的情况

double f=9.545d;
System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(new java.text.DecimalFormat("#.00").format(f));
System.out.println();
f=9.555d;
System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(new java.text.DecimalFormat("#.00").format(f));
System.out.println();
f=9.5551d;
System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
System.out.println(new java.text.DecimalFormat("#.00").format(f));

运行结果:
9.54
9.54

9.55
9.55

9.56
9.56

        2.四舍五入时出现五的情况

double f=9.545d;
System.out.println(String.format("%.2f", f));
System.out.println(Math.round(f*100)*0.01);
System.out.println();
f=9.555d;
System.out.println(String.format("%.2f", f));
System.out.println(Math.round(f*100)*0.01);
System.out.println();
f=9.5551d;
System.out.println(String.format("%.2f", f));
System.out.println(Math.round(f*100)*0.01);

运行结果:
9.55
9.55

9.56
9.56

9.56
9.56

        所以,从上边运行的情况来看,如果需要严格遵守四舍五入,需要使用第二种情况才可以。(ps:这里顺便提一下,js中使用toFixed其实是四舍六如五考虑的情况,如果希望严格的四舍五入,可以使用(Math.round(a*100)/100).toFixed(2)。但是mysql的ROUND方法却是四舍五入的)

本文出自 “塞上名猪” 博客,请务必保留此出处http://zuohao1990.blog.51cto.com/6057850/1971437

以上是关于java保留小数点后四舍五入的问题的主要内容,如果未能解决你的问题,请参考以下文章

java 两个数相除后四舍五入并保留两位小数

java double保留小数点的零的问题

android中如何实现除法的保留小数点后2位,四舍五入!

要四舍五入保留一位小数,JAVA如何实现

Github标星5.3K,java四舍五入保留小数点后四位

java金额转换的问题,想要保留小数点后两位,这样会下标越界该怎么改?