BigDecimal set Skala i okrągłe

140

Jaka jest różnica między tymi dwoma połączeniami? (Czy jest jakiś?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
użytkownik
źródło
6
oprócz zaakceptowanych odpowiedzi poniżej - setScale () tworzy nowy obiekt BigDecimal - biorąc pod uwagę jego niezmienną klasę
prash
9
@prash roundmetoda zwraca również nowe wystąpienie BigDecimal, ponieważ, jak powiedziałeś, wystąpienia są niezmienne.
daiscog

Odpowiedzi:

212

Jedną z ważnych kwestii, do której się nawiązuje, ale nie jest bezpośrednio poruszana, jest różnica między „precyzją” i „skalą” oraz sposób ich użycia w tych dwóch stwierdzeniach. „precyzja” to całkowita liczba cyfr znaczących w liczbie. „skala” to liczba cyfr po prawej stronie przecinka dziesiętnego.

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

setScale() oczywiście akceptuje skalę jako argument, podobnie jak RoundingMode, jednak dokładność nigdy nie jest określona w drugiej instrukcji.

Jeśli przesuniesz przecinek dziesiętny o jedno miejsce w prawo, różnica stanie się wyraźna:

// 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
Dale Peters
źródło
38
Re: „„ precyzja ”to całkowita liczba cyfr w liczbie." Nie. Precyzja to liczba cyfr znaczących. Dokładność 0,000042M to 2.
David J.
2
Patrz: „precyzja”: Licznik cyfr zaczyna się od skrajnej lewej niezerowej cyfry dokładnego wyniku. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy
jeśli „Precyzja to liczba cyfr znaczących”, to dlaczego dokładność 0,0000009 wynosi 2? powinno być 1
Sanchi Girotra
1
Jaka jest wartość ustawiania Twojego BigDecimal? W jaki sposób wyprowadzasz wartość (użycie String.format () może ukryć znaczące cyfry)?
dale peters
1
@SanchiGirotra Precyzja to „liczba cyfr w nieskalowanej wartości”. Precyzja 2 przy nieskalowanej wartości 90 i skali 8 daje 0,0000009. Podobnie jak precyzja 1, nieskalowana wartość 9 i skala 7
daiscog
52

Jest rzeczywiście duża różnica, o której należy pamiętać. setScale naprawdę ustawia skalę twojej liczby, podczas gdy round zaokrągla twoją liczbę do określonych cyfr, ALE zaczyna się od skrajnej lewej cyfry dokładnego wyniku, jak wspomniano w jdk. Więc jeśli chodzi o twoją próbkę, wyniki są takie same, ale zamiast tego spróbuj 0,0034. Oto moja uwaga na ten temat na moim blogu:

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

user817756
źródło