Rounding with DecimalFormat in Java

老子叫甜甜 提交于 2019-12-19 05:22:30

问题


Let's look at the following statements in Java.

System.out.println(new DecimalFormat("0").format(2.4)); //returns 2

System.out.println(new DecimalFormat("0").format(2.5)); //returns 2  <---Concentrate here
System.out.println(Math.round(2.5));                    //returns 3

System.out.println(new DecimalFormat("0").format(2.6)); //returns 3
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4

In the above statements, all other cases are obvious except the following.

System.out.println(new DecimalFormat("0").format(2.5));

It should return 3 but it returns 2. How?


回答1:


This is intentional behavior. From the documentation:

Rounding

DecimalFormat uses half-even rounding (see ROUND_HALF_EVEN) for formatting.

About ROUND_HALF_EVEN:

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. Behaves as for ROUND_HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for ROUND_HALF_DOWN if it's even. Note that this is the rounding mode that minimizes cumulative error when applied repeatedly over a sequence of calculations.

This is also known as banker's rounding.

Math.Round on the other hand uses the following formula, which is "normal" rounding:

(long)Math.floor(a + 0.5d)



回答2:


The default rounding mode of DecimalFormat is RoundingMode.HALF_EVEN. This means that it rounds up, or rounds down if the number is nearer to the next neighbour. When the number is exactly between two neighbours (in your case, 2 and 3), it rounds to the nearest even number (in your case, 2).

As you can see, when you tried it with 3.5, it rounded to 4.

If you want the more "intuitive" behaviour, call setRoundingMode(RoundingMode.HALF_UP) http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode)

this is the same as HALF_EVEN, but if the number is exactly between two neighbours, will always round upwards.



来源:https://stackoverflow.com/questions/10144636/rounding-with-decimalformat-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!