L'arrotondamento di BigDecimal su * sempre * ha due cifre decimali


217

Sto cercando di arrotondare i valori di BigDecimal a due decimali.

sto usando

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

ma non fa quello che voglio costantemente:

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

Non mi interessano le cifre significative, voglio solo due cifre decimali. Come posso farlo con BigDecimal? O c'è un'altra classe / libreria più adatta a questo?


9
Se vuoi davvero arrotondare, useresti RoundingMode.HALF_UP
Gilbert Le Blanc,

Risposte:


401
value = value.setScale(2, RoundingMode.CEILING)

19
Funziona davvero come voglio. La differenza è semplicemente che round()funziona con cifre significative mentre setScalefunziona con un numero fisso di cifre decimali o c'è di più?
Brad Mace,

44
Utilizzare RoundingMode.HALF_UP per eseguire "arrotondamenti di tipo". Questo è 1.111 dà 1.11 [SOFFITTO dà 1.12]
Grzegorz Dev

5
Grazie per RoundingMode.HALF_UP. Secondo la documentazione, è il metodo di arrotondamento comunemente insegnato nelle scuole - quello di cui avevo bisogno.
argento,

1
Fai attenzione se i tuoi valori possono essere negativi come in un'applicazione di contabilità. Potrebbe essere necessario utilizzare RoundingMode.UP invece di SOFFITTO
Dale

1
Perché setScale(...)funziona vedere setScale BigDecimal e round .
Jason Law,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.