2010-10-01 17 views
101

Jaka jest różnica między tymi dwoma połączeniami? (Czy są jakieś?)BigDecimal setScale and round

// 1. 
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP)); 
// 2. 
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP); 
+5

oprócz zaakceptowanych odpowiedzi poniżej - setScale() tworzy nowy obiekt BigDecimal - biorąc pod uwagę jego niezmienna klasy – prash

+4

@prash metoda "round" zwraca również nową instancję BigDecimal, ponieważ, jak powiedziałeś, instancje są niezmienne. – megaflop

Odpowiedz

156

Jeden ważny punkt, który nawiązywał do, ale nie bezpośrednio skierowana jest różnica między „precyzja” i „skali” i jak są one wykorzystywane w dwóch oświadczeniach. "dokładność" to całkowita liczba cyfr znaczących w liczbie. "skala" to liczba cyfr po prawej stronie separatora dziesiętnego.

Konstruktor MathContext akceptuje tylko precyzję i zaokrąglanie jako argumenty, dlatego skala nigdy nie jest określona w pierwszej instrukcji.

setScale() oczywiście przyjmuje skale jako argument, a także zaokrąglanie, jednak dokładność nigdy nie jest określona w drugiej instrukcji.

Jeśli przesunąć przecinek o jedno miejsce w prawo, różnica staje się jasne:

// 1. 
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP)); 
//result = 35.35 
// 2. 
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP); 
// result = 35.3456 
+26

Re: "" precyzja "to całkowita liczba cyfr w liczbie." Nie. Dokładność to liczba cyfr znaczących. Dokładność 0.000042M wynosi 2. –

+0

Zobacz: "precyzja": liczba cyfr zaczyna się od najwyższej cyfry od lewej strony dokładnego wyniku. https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html – Eddy

+0

, jeśli "Dokładność to liczba cyfr znaczących", niż dlaczego precyzja 0.0000009 nadchodzi jako 2? powinno być 1 –

44

Jest naprawdę duża różnica, o której należy pamiętać. setScale naprawdę ustawi skalę twojego numeru, podczas gdy runda zaokrągla twoją liczbę do określonych cyfr, ALE "zaczyna się od lewej cyfry dokładnego wyniku", jak wspomniano w jdk. Jeśli chodzi o twoją próbkę, wyniki są takie same, ale spróbuj zamiast tego 0.0034. Oto moje notatki o tym na moim blogu:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html