Redondeando BigDecimal a * siempre * tiene dos decimales

217

Estoy tratando de redondear los valores BigDecimal hacia arriba, a dos decimales.

Estoy usando

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

pero no hace lo que quiero constantemente:

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

No me importan los dígitos significativos, solo quiero dos decimales. ¿Cómo hago esto con BigDecimal? ¿O hay otra clase / biblioteca más adecuada para esto?

Brad Mace
fuente
99
Si realmente desea redondear, usaría RoundingMode.HALF_UP
Gilbert Le Blanc el

Respuestas:

401
value = value.setScale(2, RoundingMode.CEILING)
Louis Wasserman
fuente
19
De hecho, funciona como quiero. ¿Es la diferencia simplemente que round()funciona con dígitos significativos mientras que setScalefunciona con un número fijo de decimales o hay más?
Brad Mace
44
Use RoundingMode.HALF_UP para hacer "redondeo típico". Eso es 1.111 da 1.11 [TECHO da 1.12]
Grzegorz Dev
55
Gracias por RoundingMode.HALF_UP. Según la documentación, es el método de redondeo que se enseña comúnmente en las escuelas, lo que necesitaba.
plata
1
Tenga cuidado si sus valores pueden ser negativos como en una aplicación de contabilidad. Es posible que deba usar RoundingMode.UP en lugar de TECHO
Dale
1
¿Por qué setScale(...)funciona? ver BigDecimal setScale y round .
Jason Law