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.
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.
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
Publicar un comentario