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?


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

Respuestas:


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.