Si nuestro trabajo como programadores consiste en desarrollar aplicaciones financieras o de altísima precisión numérica, precisaremos utilizar recursos específicos que Java nos provee para este tipo de programas en los que los márgenes de error deben reducirse al máximo.
En este contexto, Java nos ofrece la clase BigDecimal cuyo desempeño en tratamiento y manipulación de números con coma flotante es de una altísima precisión, superando ampliamente a la operatoria realizada con datos tipo double o float, que en estas operaciones la mayoría de las veces nos darán una respuesta con un pequeño error que está alrededor de 10^-19.
En resumidas palabras podemos decir que BigDecimal es una clase especialmente diseñada para trabajar con números grandes (más de 16 dígitos significativos).
Lo primero que debemos hacer es importar la clase en la primera línea de nuestro programa:
import java.math.BigDecimal;
Luego necesitamos crear pares de valores para poder trabajar, por lo tanto vamos a crear un objeto por cada valor, al cual se le pasa un parámetro para operar, de esta forma:
public static void main(String[] args) {
BigDecimal valorA = new BigDecimal(0.1 f); //Definimos primer valor
BigDecimal valorB = new BigDecimal(3.2 f); //Definimos segundo valor
BigDecimal valorC = new BigDecimal(5); //Definimos tercer valor
Nota: Los decimales de BigDecimal, deben escribirse con .(punto) nunca con ,(coma)sino al convertir el valor a BigDecimal dará error.
Nota 2: Cuando instanciamos un objeto BigDecimal, lo podemos hacer así (0.1f)y es perfectamente utilizable, pero la recomendación en general es escribirlo como un String:
BigDecimal valorA = new BigDecimal("0.1");
Otra cosa a tener en cuenta es que con BigDecimal podemos trabajar como con cualquier otro tipo de dato, solo que al no ser nativos, no podemos usar los operadores tradicionales como + - * / o los operadores lógicos tales como < > <= >= == sino que debemos usar los métodos que tiene la propia clase BigDecimal.
Suma: Para realizar operaciones de suma, utilizaremos la función .add()
Resta: En el caso de la resta, usaremos la función .subtract()
División: Cuando queramos dividir emplearemos la función .divide()
Multiplicación: Si necesitamos multiplicar, vamos a usar la función .multiply()
En las operaciones básicas de suma, resta, multiplicación, utilizamos los métodos de esta forma:
BigDecimal suma = (valorA.add(valorB));
BigDecimal resta = (suma.subtract(valorA));
BigDecimal multiplicacion = (valorC.multiply(valorB));
Notemos que no pasamos como parámetros valores numéricos, sino las variables del tipo BigDecimal que instanciamos más arriba y la operación se asigna a otra variable cuyo tipo es BigDecimal, la variable que recibe el resultado no la hemos instanciado.
El resultado en este ejemplo está asignado a una variable, pero si no hubiese una variable “suma”, “resta” o “multiplicación” el resultado de la operación se almacenaría directamente en el primer operador valorA, como mostramos aquí:
valorA.add(valorB);//el resultado se almacena en valorA
Este método tiene algunas particularidades que es necesario conocer.
BigDecimal por defecto siempre intentará devolver el resultado exacto, entonces en una división cuyo resultado no es exacto y además tiene decimales infinitos, el programa lanzará una excepción del tipo
java.lang.ArithmeticException
Para evitar esta excepción debemos agregar algunos parámetros más a saber:
BigDecimal division = (valorC.divide(valorB,5,RoundingMode.HALF_UP));
Veamos la forma de la sentencia de arriba, se encuentra valorC, valorB, la cantidad de decimales y el modo de redondeo.
Cuando declaramos el tipo de redondeo lo haremos utilizando la clase RoundingMode (java.Math.RoundingMode), cuyos modos enunciamos aquí:
Hemos de aplicar la escala o precisión para determinar el número de decimales a los que se redondea y el modo determinará si el redondeo es hacia arriba (ROUND_HALF_UP) o hacia abajo (ROUND_HALF_DOWN), o si no es necesario redondear (ROUND_UNNECESARY).
Para redondear levemente utilizaremos la forma de HALF_
import java.math.BigDecimal;
import java.math.RoundingMode;
public class bigdecimal {
public static void main(String[] args) {
BigDecimal valorA = new BigDecimal(0.1 f);
BigDecimal valorB = new BigDecimal(3.2 f);
BigDecimal valorC = new BigDecimal(5);
BigDecimal resultadosuma = (valorA.add(valorB));
BigDecimal resultadoresta = (resultadosuma.subtract(valorA));
BigDecimal resultadomultiplicacion = (valorC.multiply(valorB));
BigDecimal resultadodivision = (valorC.divide(valorB, 5, RoundingMode.HALF_UP));
System.out.println(resultadosuma);
System.out.println(resultadoresta);
System.out.println(resultadomultiplicacion);
System.out.println(resultadodivision);
}
}
La clase BigDecimal tiene más de 50 métodos distintos que nos facilitan la manipulación de datos para obtener resultados precisos y específicos.
Es un tema tan amplio que no podemos incluir todos los modos aquí, pero podemos consultar la documentación oficial y ampliar nuestro conocimiento, en la página de Oracle:
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/math/BigDecimal.html