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?
This is intentional behavior. From the documentation:
About ROUND_HALF_EVEN:
This is also known as banker's rounding.
Math.Round
on the other hand uses the following formula, which is "normal" rounding:The default rounding mode of
DecimalFormat
isRoundingMode.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.