BigDecimal para cálculo del dinero | Java

La clase BigDecimal nos permite hacer cálculos bastante precisos con números decimales, especialmente cuando manejamos dinero, siendo una clase bastante completa que tiene sus propios métodos para las operaciones básicas que además funcionan muy bien.

¿Por qué usar BigDecimal?

Tal vez te preguntes por qué debes usar BigDecimal y no float o double que son los tipos de datos predeterminados para almacenar números decimales, y eso es porque float y double te sirven para almacenar un valor constante y sobretodo cuando se realiza un cálculo matemático se produce un error que muchas veces no se nota si estás utilizando en alguna aplicación como una calculadora. 

Ahora, supongamos que tenemos que calcular sumas, restas, multiplicaciones y divisiones con la moneda actual del país es decir requerimos sacar el impuesto de un producto, entre otros, pero si usamos un double o float corremos el riesgo de que haya un error de cálculo que muchas veces no se notará con pequeños cambios que se hagan pero si se requiere hacer unos diez millones de transacciones donde al hacer el cálculo simplemente tenemos un error de una milésima de centavo entonces veamos que pasaría después de esas supuestas transacciones.
Double error
Como se observa fácilmente hemos llegado a 100 dólares con ese pequeño error, entonces lo que trata de hacer la clase BigDecimal es reducir lo máximo posible el error en los cálculos para tener valores casi exactos.

Ejemplo


Veamos un ejemplo de cómo se realiza un cálculo de impuesto:
private BigDecimal calculateFinalPrice() {
    BigDecimal totalPrice = BigDecimal.ZERO;
    try {
        totalPrice = totalPrice.add(new BigDecimal(txtUnitCost.getText().trim()));
        if (rdbtnTaxYes.isSelected()) {
            totalPrice = totalPrice.add(totalPrice.multiply(new BigDecimal(taxPercentage)).divide(new BigDecimal("100")));
        }
        totalPrice = totalPrice.add(totalPrice.multiply(new BigDecimal(txtMarginGain.getText().trim())).divide(new BigDecimal("100")));
        txtFinalPrice.setText(totalPrice.toString());
    } catch (Exception e) {
        txtFinalPrice.setText("");
        e.printStackTrace();
    }
    return totalPrice;
}
Ten en cuenta que el código no está totalmente optimizado ya que se desarrolló para el ejemplo y no se analizó a profundidad, así que si ves que puedes mejorarlo hazlo, pero no almacenes nunca el texto de JTextField en una variable String si va a estar cambiando continuamente para evitar un consumo no deseado de memoria, ya que como sabes la variable String es inmutable lo que quiere decir que cada vez que asignamos un valor, el anterior valor queda en memoria.
Add Product Dialog
El código anterior lo que hace es calcular el precio final del producto de acuerdo al costo unitario del mismo, de si aplica impuesto y el margen de ganancia que desea el negociante, en el ejemplo de la imagen tenemos que el costo unitario del producto es de $0.78, además en este caso el producto aplica un impuesto de 12% que es configurado por el empresario y dice que desea ganar un 20% en la venta de este producto, ahora veamos como funciona el código:
  • Primero declaramos una variable BigDecimal de nombre totalPrice y la seteamos a 0.
  • Dentro de un bloque try hacemos que la variable declarada sea igual al precio del JTextField del costo unitario.
  • Como siguiente paso preguntamos si el producto aplica impuesto y le añadimos (sumamos) la multiplicación por el porcentaje de impuesto y lo dividimos para 100%.
  • Finalmente sumamos el porcentaje de margen de ganancia que se calcula al igual que el impuesto.

Comentarios

Entradas populares