2012-04-13 13 views
9

Spójrzmy na następujące stwierdzenia w Javie.Zaokrąglanie z DecimalFormat w Javie

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 

W powyższych stwierdzeniach wszystkie pozostałe przypadki są oczywiste, z wyjątkiem następujących.

System.out.println(new DecimalFormat("0").format(2.5)); 

Należy zwrócić 3 ale zwraca 2. W jaki sposób?

Odpowiedz

9

Jest to celowe zachowanie. Od the documentation:

zaokrąglania

DecimalFormat korzysta połowa nawet zaokrąglania (patrz ROUND_HALF_EVEN) do formatowania.

O ROUND_HALF_EVEN:

tryb zaokrąglania zaokrąglić w kierunku „najbliższego sąsiada”, chyba że obie są jednakowo odległe sąsiedzi, w którym to przypadku, okrągłe kierunku nawet sąsiada. Zachowuje się jak dla ROUND_HALF_UP, jeśli cyfra po lewej stronie odrzuconej frakcji jest nieparzysta; zachowuje się jak za ROUND_HALF_DOWN, jeśli jest parzysty. Zauważ, że jest to tryb zaokrąglania, który minimalizuje łączny błąd, gdy jest stosowany wielokrotnie w ciągu sekwencji obliczeń.

Jest to również nazywane zaokrąglaniem bankiera.

Math.Round drugiej strony wykorzystuje następującą formułę, która jest „normalny” zaokrąglenia:

(long)Math.floor(a + 0.5d) 
14

Domyślny tryb DecimalFormat zaokrąglenia jest RoundingMode.HALF_EVEN. Oznacza to, że zaokrągla się lub zaokrągla w dół, jeśli liczba jest bliżej sąsiada. Kiedy liczba jest dokładnie pomiędzy dwoma sąsiadami (w twoim przypadku, 2 i 3), zaokrągla się do najbliższej liczby parzystej (w twoim przypadku 2).

Jak widać, gdy próbowałem go z 3,5, to w zaokrągleniu do 4.

Jeśli chcesz bardziej „intuicyjne” zachowanie, zadzwoń setRoundingMode(RoundingMode.HALF_UP) http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode)

ten jest taki sam jak HALF_EVEN, ale jeśli liczba jest dokładnie pomiędzy dwoma sąsiadami, zawsze będzie zaokrąglała w górę.