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)