El uso de BigDecimal sobre Double en cálculos financieros


Las computadoras difieren en la manera que realizan cálculos aritméticos: Para mayor eficiencia, usan el sistema numérico binario, mientras que nosotros usamos el decimal. A la hora de programar, cuando usamos variables del tipo Float o Double, pueden ocurrir errores de precisión derivados del procesamiento en binario, diferente a los tipos de errores que nosotros encontramos. Por ejemplo, al contar en decimal, tenemos problemas para representar la tercera parte de la unidad (1/3), y la escribimos 0,333... infinitamente. Por otro lado, si nuestro sistema de numeración tuviera como base 9, entonces podríamos representar la tercera parte de un entero con 0.3 y seria mucho mas preciso.

Del mismo modo, en binario no se puede representar la décima parte de la unidad (1/10) ni la centésima, y por eso cuando escribimos 0.01, la computadora lo entiende 110011001100... hasta el infinito, y por ende efectuará ciertos cálculos incorrectamente desde el punto de vista decimal.
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.
Podemos correr una prueba para verificar las diferencias entre los tipos de datos Double (o Float), y BigDecimal. Primero ejecutamos:

double unDecimo = 0.01;
double suma = unDecimo + unDecimo + unDecimo + unDecimo + unDecimo + unDecimo;
System.out.println(suma);

Se imprime 0.060000000000000005 en vez de 0.06. Ahora ejecutamos:

java.math.BigDecimal unDecimo = new java.math.BigDecimal("0.01");
java.math.BigDecimal suma= unDecimo.add(unDecimo).add(unDecimo).add(unDecimo).add(unDecimo).add(unDecimo);
System.out.println(suma); 

Ahora imprime 0.06

No hay comentarios:

Publicar un comentario