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?


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

Respostas:


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.