The following code:
double doubleValue = 1713.6;
float floatValue = 1713.6f;
String fs = "%-9s : %-7s %-7s\n";
System.out.printf( fs, "", "double", "float" );
DecimalFormat format = new DecimalFormat("#0");
System.out.printf( fs, "toString", String.valueOf( doubleValue ), String.valueOf( floatValue ) );
format.setRoundingMode( RoundingMode.DOWN );
System.out.printf( fs, "DOWN", format.format( doubleValue ), format.format( floatValue ) );
format.setRoundingMode( RoundingMode.HALF_DOWN );
System.out.printf( fs, "HALF_DOWN", format.format( doubleValue ), format.format( floatValue ) );
format.setRoundingMode( RoundingMode.HALF_UP );
System.out.printf( fs, "HALF_UP", format.format( doubleValue ), format.format( floatValue ) );
format.setRoundingMode( RoundingMode.UP );
System.out.printf( fs, "UP", format.format( doubleValue ), format.format( floatValue ) );
Produces the result (live code):
: double float
toString : 1713.6 1713.6
DOWN : 1713 1713
HALF_DOWN : 1714 1714
HALF_UP : 1713 1714 <--- notice this line
UP : 1714 1714
I know that certain numbers cannot be represented exactly as floating-point numbers. The actual floating-point representation for 1713.6 is 1713.5999755859375 (see this page).
But why does HALF_UP round down in this case?
Using Java 1.8u25
HALF_EVEN. public static final RoundingMode HALF_EVEN. Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.
DOWN − Rounding mode to round towards zero. FLOOR − Rounding mode to round towards negative infinity. HALF_DOWN − Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
1. DecimalFormat(“0.00”) We can use DecimalFormat("0.00") to ensure the number always round to 2 decimal places. For DecimalFormat , the default rounding mode is RoundingMode.
There was a bug in Java 8 regarding the NumberFormat and RoundingMod HALF_UP see 8039915. This was fixed with 8u40 (Release Notes).
Ideone is using sun-jdk-8u25 where this buggy behavior is appearing.
On Java 1.7, I'm getting HALF_UP : 1714 1714 which is right.
enum RoundingMode - Specifies a rounding behavior for numerical operations capable of discarding precision.
See Oracle javadoc: Result of rounding input to one digit with the given rounding mode[Rounding Mode Table]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With