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 con esto?
Respuestas:
Puede utilizar setScale()
para reducir el número de dígitos fraccionarios a cero. Suponiendo que se value
mantiene el valor a redondear:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
El uso 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 BigDecimal
objetos son inmutables; ambos setScale
y round
devolverán un nuevo objeto).
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
imprime falso
RoundingMode
¿que es eso? EsBigDecimal
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
Lo cual 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.
DecimalFormat
(como en new DecimalFormat("###.00")
) para administrar la conversión de un BigDecimal
back to string. Da "101.00"
como resultado para ambos valores que los fragmentos de @Grodriquez y usted crearon.
Aquí hay una solución terriblemente 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
input.toBigInteger().toString().length()
parte sería mucho más eficiente usando un logaritmo, algo comoround_up(log(input)) + (1 if input is a power of ten, else 0)
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í con 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 sea correcto.
Usted quiere
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
round
: "Si el ajuste de precisión es 0, no se realiza ningún redondeo".