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?
java
rounding
bigdecimal
n / A
fuente
fuente
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
imprime falsoRoundingMode
¿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.
fuente
DecimalFormat
(como ennew DecimalFormat("###.00")
) para administrar la conversión de unBigDecimal
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:
fuente
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);
fuente
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.
fuente
Usted quiere
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
fuente
round
: "Si el ajuste de precisión es 0, no se realiza ningún redondeo".