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);
java
bigdecimal
użytkownik
źródło
źródło
round
metoda zwraca również nowe wystąpienie BigDecimal, ponieważ, jak powiedziałeś, wystąpienia są niezmienne.Odpowiedzi:
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:
źródło
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
źródło