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);
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);
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
Re: "" precyzja "to całkowita liczba cyfr w liczbie." Nie. Dokładność to liczba cyfr znaczących. Dokładność 0.000042M wynosi 2. –
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
, jeśli "Dokładność to liczba cyfr znaczących", niż dlaczego precyzja 0.0000009 nadchodzi jako 2? powinno być 1 –
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
oprócz zaakceptowanych odpowiedzi poniżej - setScale() tworzy nowy obiekt BigDecimal - biorąc pod uwagę jego niezmienna klasy – prash
@prash metoda "round" zwraca również nową instancję BigDecimal, ponieważ, jak powiedziałeś, instancje są niezmienne. – megaflop