2015-01-10 11 views
6

Według mojego zrozumienia, z półokrągłym zaokrągleniem, jeśli liczba, na którą się zaokrąglasz, znajduje się w równej odległości między sąsiadami (na przykład 4,5, jeśli zaokrąglasz jedną po przecinku), wykonujesz zaokrąglenie poprzedzającego numeru do najbliższej liczby parzystej.Półokrągłe zaokrąglanie

Na przykład, jeśli zaokrąglić do 0 cyfr po przecinku 1,5, 3,5, 5,5, 7,5 i 9,5 zostaną zaokrąglone w górę odpowiednio do 2, 4, 6, 8 i 10. Wszystko działa dobrze i dobrze w netbeans, ale mam problemy, gdy zaokrąglam do 1 miejsca po przecinku.

package foo; 
import java.text.NumberFormat; 

public class Foo { 
    public static void main(String[] args) { 
     NumberFormat formatter = NumberFormat.getNumberInstance();  
     formatter.setMaximumFractionDigits(1); 
     System.out.print(formatter.format(4.45)); 
    } 
} 

run:

4.5 

BUILD SUCCESSFUL (total time: 0 seconds) 

Myślę, że byłoby to zaokrąglić do 4,4

Dodatkowo, jeśli używam 4,55 dla wejścia w formacie 4.5 jest wyjście gdzie spodziewam 4,6 Czy istnieje błąd z java lub z moim zrozumieniem?

+0

[s] Na pewno numberFormat jest pół-nawet domyślnie? [/ S] nieważne, że jest. – Arhowk

+0

Po prostu uruchomiłem twój kod i dało mi 4.4 – Arhowk

+0

Otrzymuję 4,4. Jakiej wersji Java używasz? –

Odpowiedz

4

Nie jestem pewien, czy to technicznie błąd.

Kwestia jest taka, że ​​kiedy piszesz 4.45 a wartość jest interpretowana jako double, że jest zaokrąglana do binarnym frakcji: suma wielokrotności potęgi 2 do pewnego precyzją. (To zaokrąglenie jest wykonywane za pomocą zaokrąglania HALF_EVEN, ale z cyframi binarnymi zamiast cyfr dziesiętnych.)

Ta zaokrąglona wartość może być nieco powyżej lub nieco poniżej 4,45, ale NumberFormat zaokrągli prawdziwą wartość binarną przechowywaną w podwójnym, nie wartość dziesiętna, którą napisałeś.

można określić rzeczywistą wartość binarną jesteś rzeczywiście coraz pisząc System.out.println(new BigDecimal(4.45)); Kiedy to zrobić, mam 4.45000000000000017763568394002504646778106689453125, która jest rzeczywista wartość jest zaokrąglana do najbliższej 0,1 - co jest z pewnością będzie 4.5.

1

To zaokrągla do liczby całkowitej, spróbuj tego

formatter.setMaximumFractionDigits(0); 
    System.out.println(formatter.format(4.5)); 
    System.out.println(formatter.format(5.5)); 

wyświetlamy

4 
6