BigDecimal setScale and round

Jaka jest różnica między tymi dwoma telefonami? (Czy są jakieś?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Author: user, 2010-10-02

2 answers

Ważnym punktem, który jest aluzją, ale nie jest bezpośrednio adresowany, jest różnica między "precyzja" i "Skala" i jak są one używane w dwóch wyrażeniach. "precyzja" jest całkowitą liczbą cyfr znaczących w liczbie. "scale" to liczba cyfr po prawej stronie punktu dziesiętnego.

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

setScale() Oczywiście przyjmuje skalę jako argument, jak również RoundingMode, jednak precyzja nigdy nie jest określona w drugim poleceniu.

Jeśli przesuniesz punkt dziesiętny o jedno miejsce w prawo, różnica stanie się jasna:

// 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
 171
Author: dale peters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 23:48:33

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

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

 47
Author: user817756,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-27 16:20:07