El problema que tiene es que 0.1 se representa con un número ligeramente mayor, p. Ej.
System.out.println(new BigDecimal(0.1));
impresiones
0.1000000000000000055511151231257827021181583404541015625
El doble.toString() tiene en cuenta este error de representación por lo que no lo ve.
De forma similar, 0.3 se representa con un valor ligeramente más bajo de lo que realmente es.
0.299999999999999988897769753748434595763683319091796875
Si se multiplica el valor representado de 0,1 por 3 no obtiene el valor representado por 0,3, que en lugar de obtener algo un poco más alto
0.3000000000000000166533453693773481063544750213623046875
Esto no es sólo un error de representación, sino también un error de redondeo causado por las operaciones. Esto es más de lo que Double.toString() corregirá y entonces verá el error de redondeo.
La moraleja de la historia, si usa float
o double
también redondea la solución de forma adecuada.
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5)/1e6; // round to 6 decimal places.
System.out.println(d2);
impresiones
0.30000000000000004
0.3
... Usted no está usando 'BigDecimal'. Estás haciendo * exactamente lo mismo * que agregar los dobles. 'doubleValue()' devuelve ... un doble. Consulte el Javadoc para 'BigDecimal' sobre cómo agregar/restar/etc –
Con los cálculos' dobles', consulte [Lo que todo científico informático debe saber sobre la aritmética de coma flotante] (http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html). Java resuelve esto al proporcionar opciones de formato para la salida. –
¿Por qué está utilizando 'doubleValue()' ??? Pensé que querías un tipo decimal. –