Por favor, activa JavaScript y desactiva tu adblock para este sitio

El Javatar

Blog dedicado a la Programación en Java, C, PHP, Phyton, HTML, SQL y Mucho Más

miércoles, 2 de abril de 2014

Cálculos Exactos en Java: Uso de las Clases BigInteger y BigDecimal

Cálculos Exactos en Java - Uso de las Clases BigInteger y BigDecimal
Cuando aprendemos a programar, conocemos los tipos de datos básicos entre los cuales están los tipos de datos numéricos en los cuales encontramos los enteros y los reales, que para el caso de java serían los Integer y los Float.

Sin embargo, si se desean hacer cálculos con valores un poco grandes, o varios decimales para el caso de los tipo float, el resultado obtenido no será del todo exacto, y es por tal razón que se acuden a dos tipos de datos que tienen la capacidad de almacenar valores más grandes y por consiguiente los valores calculados son más exactos.

Estos tipos de valores son los pertenecientes a las clases Long para cantidades enteras y los Double para los valores decimales. Sin embargo, estos tipos de datos, a pesar de que son más exactos que los Integer y los Float, también tienen sus límites, por tanto se hace necesaria la implementación de nuevos tipos de datos que muestren valores muy grandes, como por ejemplo 13^124.

Para esto se hace necesaria la implementación de nuevas clases que tienen la capacidad de almacenar valores que podríamos decir son prácticamente ilimitados. Estas son las clases BigInteger y BigDecimal Al ser clases con sus propios métodos, también tienen su propia forma para declararlos.

A continuación veremos algunos métodos de la clase BigInteger:

import java.math.BigInteger;

public class PruebaBigInteger {

    public static void main(String[] args) {
        // El constructor de la clase BigInteger exige que se le pase como parámetro un valor BigInteger
        // Pero cono en este caso queremos asignarle un valor entero, la clase BigInteger cuenta con un
        // método stático que es valueOf(long l) a través del cual se le pasa un valor de tipo long, y
        // como cualquier valor de tipo entero puede ser reconocido como long, podemos asignarlo de la
        // siguiente forma:
        BigInteger num1 = BigInteger.valueOf(25);
        System.out.println("Valor inicial = " + num1);

        // Para multiplicar valores BigInteger, se hace a través de un método específico de esta clase
        // llamado multiply(BigInteger bi) y como debe ser multiplicado con otro valor del mismo tipo
        // usamos el método valueOf(long l) para convertir un número entero en BigDecimal
        num1 = num1.multiply(BigInteger.valueOf(10));
        System.out.println("Resultado de la Multiplicación = " + num1);

        // Método para sumar: add(BigInteger bi)
        num1 = num1.add(BigInteger.valueOf(50));
        System.out.println("Resultado de la Suma = " + num1);

        // Método para dividir: divide(BigInteger bi)
        num1 = num1.divide(BigInteger.valueOf(15));
        System.out.println("Resultado de la División = " + num1);

        // Método para restar: subtract(BigInteger bi)
        num1 = num1.subtract(BigInteger.valueOf(5));
        System.out.println("Resultado de la Resta = " + num1);

        // Método para elevar a una potencia: pow(int i). En este método si se puede recibir un valor
        // entero, por lo tanto lo colocamos directamente en el método
        num1 = num1.pow(128);
        System.out.println("Resultado de la Potencia = " + num1);
    }

}

El resultado de ejecutar éste código sería el siguiente:

Valor inicial = 25
Resultado de la Multiplicación = 250
Resultado de la Suma = 300
Resultado de la División = 20
Resultado de la Resta = 15
Resultado de la Potencia = 3464823841570940447511989197632600142600357270938450628136751668972148475371287127017463688665854485527890158948205456823643544339574873447418212890625

Éste es sólo un ejemplo, pues la idea de usar la clase BigInteger y BigDecimal cobra real importancia cuando se trabajan con cantidades muy grandes que requieren de cálculos exactos, como por ejemplo las entidades bancarias.

Los anteriores son solamente algunos de los métodos usados en la clase BigInteger, y el uso es muy similar para la clase BigDecimal, sin embargo si deseas explorar otros métodos de éstas clase, puedes revisar la respectiva documentación en los siguientes enlaces:



1 comentario: