¿Cómo lidiar con varas redondas en BigDecimal en Java

César;

Tengo este código para obtener un porcentaje:

final BigDecimal price = BigDecimal.valueOf(215).setScale(2, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(2, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(2, BigDecimal.ROUND_HALF_EVEN);

System.out.println(dayPrice); //71.67
System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01

Tengo una reserva que cuesta $ 215.00, esta reserva ha 3 por día, por lo que, el precio es de $ 71.67.

Si trato de obtener el valor original de nuevo, tengo algunos problemas con el redondeo, 71.67 * 3 = 215,01

¿Cómo lidiar con este tipo de problema?

Steve:

Mi sensación es que el problema aquí no es uno de tirar el precio original, pero en lugar de arrojar información valiosa forma truncando los valores fraccionarios con dos decimales. Si mantiene aún un lugar más decimal, que no tendría este problema.

He aquí un ejemplo que mantiene a 6 lugares de precisión para permitir la suficiente precisión para hacer cientos de operaciones sobre valores por los que finalmente me quiero sólo dos cifras decimales significativos. Usted nunca tendrá problemas de redondeo con 6 decimales si sólo se preocupan en el extremo alrededor de 2 plazas.

Este código guarda 6 lugares, excepto cuando se imprime el precio de un solo día, momento en el cual se redondea a 2 lugares.

final BigDecimal price = BigDecimal.valueOf(215).setScale(6, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(6, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(6, BigDecimal.ROUND_HALF_EVEN);

System.out.println(dayPrice.setScale(2, BigDecimal.ROUND_HALF_EVEN));
System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01

Resultado:

71.67
215.00

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=318151&siteId=1
Recomendado
Clasificación