2013-03-12 14 views
5

Poniższy kod, który wykorzystuje RoundingMode.HALF_EVEN,tryb zaokrąglania z BigDecimal Java

BigDecimal value1 = new BigDecimal("4.5"); 
value1=value1.setScale(0, RoundingMode.HALF_EVEN); 

BigDecimal value2 = new BigDecimal("6.5"); 
value2=value2.setScale(0, RoundingMode.HALF_EVEN); 

System.out.println(value1+"\n"+value2); 

wyświetlacze 4 i 6 odpowiednio. Wydaje mi się, że powinien on wyświetlać odpowiednio: 5 i 7, ponieważ cyfra po lewej stronie odrzuconej części ułamkowej (która w tym przypadku wynosi 5) to nieparzysta. W tym przypadku, wykonuje to RoundingMode.HALF_UP

A w przypadku RoundingMode.HALF_UP, RoundingMode.UP przeprowadza się, gdy część odrzucona frakcjonowanej> = 0,5 (co jest prawdą), poza RoundingMode.DOWN jest wykonywana.

+0

'4' i' 6' to 'NAWET 'w' ROUND_HALF_EVEN'. '.5' jest częścią' HALF'. –

+2

Dla potomności, musiałem to przeczytać kilka razy, aby ją zdobyć. Przykładem, który miał dla mnie sens, jest to, że jeśli zaokrąglasz 6.5, jesteś w równej odległości od 6 i 7. Ponieważ 6 jest równy, wybrałeś tę. –

Odpowiedz

13

zachowanie jest dobrze opisane w Javadoc:

tryb zaokrąglania zaokrąglić w kierunku „najbliższego sąsiada” chyba że obie sąsiedzi są w równych odległościach, w tym przypadku, okrągłe kierunku nawet sąsiada.

Więc biorąc pod uwagę liczbę 4.5, która mieści się w samym środku zakresu numerów między 4 i 5, po wywołaniu:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN); 

Środowisko wykonawcze musi dowiedzieć się, które sąsiad zaokrąglić zbyt , aka, czy powinien zaokrąglić do 4, czy do 5? Zwykle zaokrąglałoby się w zależności od tego, do której wartości 4.5 jest bliższa, ale w tym przypadku jest blisko do sąsiadów obu. Zamiast wybierać arbitralnie wynik końcowy, wybiera jednak parzystą liczbę. To jest zachowanie ROUND_HALF_EVEN. Jeśli chcesz, możesz podać ROUND_HALF_UP, a ostateczny wynik będzie wynosił 5, a nie 4. Pamiętaj też, że ustalenie sposobu rundy zależy od tego, jaki będzie wynik końcowy (a nie od części dziesiętnej). dużego dziesiętnego, jak się wydaje zakładałeś).

+0

Nie dostałem tego cytowanego tekstu. – Tiny

+0

@ Tiny, oznacza to, że jeśli liczba, którą zaokrąglasz, w trybie połowy parzystej, znajduje się w środku zakresu pomiędzy liczbą nieparzystą i parzystą, że liczba parzysta będzie wynikiem operacji zaokrąglania. – Perception

+0

Jeśli możesz, wyjaśnij na prostym przykładzie. Uważam, że ta bardzo podstawowa rzecz jest trudna do zrozumienia i osobiście, nie mogę się z kimś zwrócić do pomocy. – Tiny

Powiązane problemy