Las computadoras no cuentan de la misma manera que nosotros, puesto que nosotros utilizamos un sistema de numeración decimal y las computadoras uno binario.
Cuando usamos una variable float o double, estamos dejandole al microprocesador de la computadora el trabajo de efectuar los cálculos directamente, pero como las computadoras efectúan sus cálculos en binario, cometen errores de precisión diferentes a los nuestros.
Veamos un ejemplo con ambas clases.
Double:
double unCentavo = 0.01; double suma=unCentavo+unCentavo+unCentavo+unCentavo+unCentavo+unCentavo; System.out.println(suma);
Al imprimir, podemos ver que obtenemos: 0.060000000000000005.
BigDecimal:
java.math.BigDecimal unCentavo = new java.math.BigDecimal("0.01"); java.math.BigDecimal suma=unCentavo.add(unCentavo).add(unCentavo).add(unCentavo).add(unCentavo).add(unCentavo); System.out.println(suma);
Y en este caso obtenemos: 0.06.
Esto se debe a que en binario (base 2) no se puede representar a 1/10 (la décima parte de 1) ni 1/100 (la centésima parte de 1). Por eso, cuando nosotros escribimos 0.01, la computadora lo entiende como 1100110011001100... (hasta el infinito) y efectúa el cálculo con un error.
Al trabajar en sistemas financieros, los pequeños errores de calculo acumulados con varios centavos, pueden resultar en reportes cuyos cálculos diferirán de las operaciones que normalmente realizamos.
Para resolver este problema, en Java se incluye la clase BigDecimal, que realiza cálculos de manera decimal igual que nosotros, pero con la desventaja de que los realiza mas lento que los tipos de datos Double o Float.
Cuéntanos en un comentario si te ha servido este artículo.
No hay comentarios:
Publicar un comentario