Poniższy kod:Dlaczego HALF_UP czasami zaokrągla w dół z podwójnym?
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));
Produkuje wyniku (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
Wiem, że niektóre numery nie mogą być reprezentowane dokładnie jak liczb zmiennoprzecinkowych. Rzeczywista reprezentacja zmiennoprzecinkowa dla 1713.6 wynosi 1713.5999755859375 (patrz this page).
Ale czy dlaczego w tym przypadku HALF_UP rundy w dół?
Korzystanie Java 1.8u25
Która wersja Java jest tą i na jakiej platformie? Drukuje 1714 na moim komputerze, zarówno w Javie 1.7, jak i Java 1.8. – RealSkeptic
Drukuje 1713 na JDK 1.8b25, 64bit, Linux. –