Java BigDecimal: Redondea al valor entero más cercano

Necesito los siguientes resultados

100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 

.round() o .setScale() ? ¿Cómo hago esto?

Puede usar setScale() para reducir el número de dígitos fraccionarios a cero. Suponiendo que el value tiene el valor que se redondeará:

 BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -> " + scaled); 

Usar round() es un poco más complicado ya que requiere que especifique la cantidad de dígitos que se retendrán. En sus ejemplos, esto sería 3, pero esto no es válido para todos los valores:

 BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP)); System.out.println(value + " -> " + rounded); 

(Tenga en cuenta que los objetos BigDecimal son inmutables, tanto setScale como round devolverán un nuevo objeto).

Si sigo la respuesta de Grodriguez

 System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); System.out.println("" + value); 

Esta es la salida

 100.23 -> 100 100.77 -> 101 

Que no es exactamente lo que quiero, así que terminé haciendo esto …

 System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); value = value.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("" + value); 

Esto es lo que obtengo

 100.23 -> 100.00 100.77 -> 101.00 

Esto resuelve mi problema por ahora … 🙂 Gracias a todos.

Aquí hay una solución tremendamente complicada, pero funciona:

 public static BigDecimal roundBigDecimal(final BigDecimal input){ return input.round( new MathContext( input.toBigInteger().toString().length(), RoundingMode.HALF_UP ) ); } 

Código de prueba:

 List bigDecimals = Arrays.asList(new BigDecimal("100.12"), new BigDecimal("100.44"), new BigDecimal("100.50"), new BigDecimal("100.75")); for(final BigDecimal bd : bigDecimals){ System.out.println(roundBigDecimal(bd).toPlainString()); } 

Salida:

100
100
101
101

Simplemente mira:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

y:

 setScale(int precision, int roundingMode) 

O si usa Java 6, entonces

http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

y también:

 setScale(int precision, RoundingMode mode); round(MathContext mc); 

No creo que puedas redondearlo así en un solo comando. Tratar

  ArrayList list = new ArrayList(); list.add(new BigDecimal("100.12")); list.add(new BigDecimal("100.44")); list.add(new BigDecimal("100.50")); list.add(new BigDecimal("100.75")); for (BigDecimal bd : list){ System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2)); } Output: 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 

Probé el rest de tus ejemplos y devuelve los valores deseados, pero no garantizo su corrección.

Usted quiere

 round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP