usar - Java BigDecimal: redondea al valor entero más cercano
redondear una cantidad en java (6)
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 para esto?
Aquí hay una solución muy 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<BigDecimal> 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
No creo que puedas redondearlo así en un solo comando. Tratar
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
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 resto de sus ejemplos y devuelve los valores deseados, pero no garantizo que sean correctos.
Puede usar setScale()
para reducir el número de dígitos fraccionarios a cero. Suponiendo que el value
tiene el valor a 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 el número de dígitos que se conservará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 voy por 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
Lo 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.
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 usas 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);
Usted quiere
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP