Arredondar BigDecimal para * sempre * tem duas casas decimais

217

Estou tentando arredondar os valores BigDecimal para duas casas decimais.

estou a usar

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

mas não faz o que eu quero consistentemente:

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

Não ligo para dígitos significativos, só quero duas casas decimais. Como faço isso com o BigDecimal? Ou existe outra classe / biblioteca mais adequada para isso?

Brad Mace
fonte
9
Se você realmente deseja arredondar, usaria RoundingMode.HALF_UP
Gilbert Le Blanc

Respostas:

401
value = value.setScale(2, RoundingMode.CEILING)
Louis Wasserman
fonte
19
Isso realmente funciona como eu quero. A diferença é que simplesmente round()funciona com dígitos significativos, enquanto setScaletrabalha com um número fixo de casas decimais ou há mais?
Brad Mace
44
Use RoundingMode.HALF_UP para fazer "arredondamento típico". Ou seja, 1.111 dá 1.11 [CEILING gives 1.12]
Grzegorz Dev 14/10
5
Obrigado por RoundingMode.HALF_UP. De acordo com a documentação, é o método de arredondamento comumente ensinado nas escolas - o que eu precisava.
silver
1
Tome cuidado se seus valores puderem ser negativos como em um aplicativo de contabilidade. Você pode precisar usar RoundingMode.UP em vez de CEILING
Dale
1
Por que setScale(...)funciona? consulte BigDecimal setScale e round .
Jason Lei