Icono play
Java
BigDecimal Java

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).

Cómo utilizar la clase BigDecimal en Java

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.

Métodos más utilizados de la 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

El método .divide() y sus particularidades

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:

  • Precisión (escala): cantidad de cifras decimales luego de la coma.
  • Tipo de redondeo: si el redondeo será al más próximo para abajo o para arriba.

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í:

  • ROUND_CEILING  
  • ROUND_DOWN
  • ROUND_FLOOR
  • ROUND_HALF_DOWN
  • ROUND_HALF_EVEN
  • ROUND_HALF_UP
  • ROUND_UNNECESARY 
  • ROUND_UP.

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_

Ejemplo de aplicación de BigDecimal

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);
    }

}

Consideraciones finales

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

¿Todavía no te has apuntado a nuestro Bootcamp?
Tenemos muchos cursos para ofrecerte y ¡TOTALMENTE GRATIS! Estos son algunos de ellos: