Das Runden von BigDecimal auf * immer * hat zwei Dezimalstellen

217

Ich versuche, BigDecimal-Werte auf zwei Dezimalstellen aufzurunden.

Ich benutze

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

aber es macht nicht konsequent was ich will:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

Ich interessiere mich nicht für signifikante Ziffern, ich möchte nur zwei Dezimalstellen. Wie mache ich das mit BigDecimal? Oder gibt es eine andere Klasse / Bibliothek, die besser dafür geeignet ist?

Brad Mace
quelle
9
Wenn Sie tatsächlich runden möchten, würden Sie RoundingMode.HALF_UP
Gilbert Le Blanc

Antworten:

401
value = value.setScale(2, RoundingMode.CEILING)
Louis Wasserman
quelle
19
Das funktioniert in der Tat so, wie ich es will. Funktioniert der Unterschied einfach round()mit signifikanten Ziffern, während setScalemit einer festen Anzahl von Dezimalstellen gearbeitet wird, oder steckt mehr dahinter?
Brad Mace
44
Verwenden Sie RoundingMode.HALF_UP, um "typcal rounding" durchzuführen. Das ist 1,111 ergibt 1,11 [CEILING ergibt 1,12]
Grzegorz Dev
5
Danke für RoundingMode.HALF_UP. Laut Dokumentation ist es die in Schulen übliche Rundungsmethode - was ich brauchte.
Silber
1
Achten Sie darauf, ob Ihre Werte wie in einer Buchhaltungsanwendung negativ sein können. Möglicherweise müssen Sie RoundingMode.UP anstelle von CEILING
Dale
1
Warum setScale(...)arbeitet? siehe BigDecimal setScale und round .
Jason Law