2015-06-04 14 views
10

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

+1

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

+0

Drukuje 1713 na JDK 1.8b25, 64bit, Linux. –

Odpowiedz

Powiązane problemy