Rounding with DecimalFormat in Java

Lion picture Lion · Apr 13, 2012 · Viewed 18.9k times · Source

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?

Answer

Jon Bright picture Jon Bright · Apr 13, 2012

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.