valor usar una truncar redondear programa primer para numeros numero float decimales como cantidad java rounding bigdecimal

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.



Usted quiere

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