Saltar al contenido

¿Cómo funciona java.math.RoundingMode?

Solución:

El problema que tiene es que el doble no es una representación precisa y se redondea basándose en este número impreciso.

BigDecimal bd = new BigDecimal(1.555d);
System.out.println("bd=" + bd);
bd = bd.setScale(2, RoundingMode.HALF_UP);
System.out.println("after rounding bd=" + bd);
double d = bd.doubleValue();
System.out.println("after rounding d=" + d);

huellas dactilares

bd=1.5549999999999999378275106209912337362766265869140625
after rounding bd=1.55
after rounding d=1.55

sin embargo

BigDecimal bd = BigDecimal.valueOf(1.555d);
System.out.println("bd=" + bd);
bd = bd.setScale(2, RoundingMode.HALF_UP);
System.out.println("after rounding bd=" + bd);
double d = bd.doubleValue();
System.out.println("after rounding d=" + d);

huellas dactilares

bd=1.555
after rounding bd=1.56
after rounding d=1.56

Esto funciona porque BigDecimal.valueOf realiza un redondeo adicional en función de cómo aparecería el doble si lo imprimiera.


Sin embargo, no usaría BigDecimal a menos que el rendimiento / simplicidad no sea un problema.

double d = 1.555d;
System.out.println("d=" + d);
d = roundToTwoPlaces(d);
System.out.println("after rounding d=" + d);

public static double roundToTwoPlaces(double d) {
    return ((long) (d < 0 ? d * 100 - 0.5 : d * 100 + 0.5)) / 100.0;
}

huellas dactilares

d=1.555
after rounding d=1.56

Para obtener más detalles, Double your money vuelve a comparar el rendimiento de diferentes formas de redondeo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *