Si tengo una matriz de dobles que tienen EXACTAMENTE dos lugares decimales, agréguelas por completo mediante un bucle e imprima el total; lo que sale es un número con MÁS DE dos lugares decimales. Lo cual es extraño, porque teóricamente, al sumar dos números, cada uno con 2 y solo 2 decimales NUNCA producirá un número que tenga un dígito distinto de cero más allá del lugar de las centésimas.Comportamiento extraño de Java: ¿Cómo es que al agregar dobles con EXACTAMENTE dos lugares decimales resulta en un doble con MÁS DE dos lugares decimales?
Trate de ejecución de este código:
double[] d = new double[2000];
for (int i = 0; i < d.length; i++) {
d[i] = 9.99;
}
double total = 0,00;
for (int i = 0; i < d.length; i++) {
total += d[i];
if (("" + total).matches("[0-9]+\\.[0-9]{3,}")) { // if there are 3 or more decimal places in the total
System.out.println("total: " + total + ", " + i); // print the total and the iteration when it occured
}
}
En mi equipo, esto imprime:
total: 59.940000000000005, 5
Si redondear el total a dos cifras decimales a continuación, me gustaría obtener el mismo número que Lo haría si manualmente agregué 9.99 seis veces en una calculadora. ¿Pero cómo es que esto está sucediendo y de dónde vienen los decimales extra? ¿Estoy haciendo algo mal o (dudo que esto sea probable) es esto un error de Java?
posible duplicado de [Doble impredecible] (http://stackoverflow.com/questions/9667324/unpredictable-double) – assylias
¿Ha intentado utilizar DecimalFormat y RoundingMode? http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html http://docs.oracle.com/javase/6/docs/api/java/math/RoundingMode.html – ChadNC