La clase BigDecimal proporciona operaciones con números dobles para aritmética, manejo de escalas, redondeo, comparación, conversión de formato y hash. Puede manejar números de coma flotante muy grandes y muy pequeños con gran precisión pero compensando un poco la complejidad del tiempo.
Un BigDecimal consta de un valor entero sin escala de precisión aleatoria y una escala de entero de 32 bits. Si es mayor o igual a cero, la escala es el número de dígitos a la derecha del punto decimal. Si es menor que cero, el valor sin escala del número se multiplica por 10 ^ (escala -).

Ejemplos:

Input : double a=0.03;
        double b=0.04;
        double c=b-a;
        System.out.println(c);
Output :0.009999999999999998

Input : BigDecimal _a = new BigDecimal("0.03");
        BigDecimal _b = new BigDecimal("0.04");
        BigDecimal _c = _b.subtract(_a);
        System.out.println(_c);
Output :0.01

Necesidad de BigDecimal

  • Los dos tipos primitivos de Java (doble y flotante) son números de punto flotante, que se almacenan como una representación binaria de una fracción y un exponente.
  • Otros tipos primitivos (excepto booleanos) son números de coma fija. A diferencia de los números de punto fijo, los números de punto flotante la mayoría de las veces devolverán una respuesta con un pequeño error (alrededor de 10 ^ -19) .Esta es la razón por la que terminamos con 0.009999999999999998 como resultado de 0.04-0.03 en el ejemplo anterior.

Pero BigDecimal nos proporciona la respuesta exacta.

 

import java.math.BigDecimal;

public class BigDecimalExample

{

    public static void main(String[] args) 

    {

        

        BigDecimal bd1 = 

               new BigDecimal("124567890.0987654321");

        BigDecimal bd2 = 

               new BigDecimal("987654321.123456789");

         

        

        bd1 = bd1.add(bd2);

        System.out.println("BigDecimal1 = " + bd1);

 

        

        bd1 = bd1.multiply(bd2);

        System.out.println("BigDecimal1 = " + bd1);

 

        

        bd1 = bd1.subtract(bd2);

        System.out.println("BigDecimal1 = " + bd1);

 

        

        bd1 = bd1.divide(bd2);

        System.out.println("BigDecimal1 = " + bd1);

 

        

        bd1 = bd1.pow(2);

        System.out.println("BigDecimal1 = " + bd1);

 

        

        bd1 = bd1.negate();

        System.out.println("BigDecimal1 = " + bd1);

    }    

}        

Producción:-

BigDecimal1 = 1112222211.2222222211
BigDecimal1 = 1098491072963113850.7436076939614540479
BigDecimal1 = 1098491071975459529.6201509049614540479
BigDecimal1 = 1112222210.2222222211
BigDecimal1 = 1237038244911605079.77528397755061728521
BigDecimal1 = -1237038244911605079.77528397755061728521

Declaración

double a, b;                
BigDecimal A, B; 

Inicialización:

a = 5.4;
b = 2.3;
A  = BigDecimal.valueOf(5.4);
B  = BigDecimal.valueOf(2.3); 

Si se le da una representación de cadena de un número doble, puede inicializar de la siguiente manera:

A  = new BigDecimal(“5.4”);
B  = new BigDecimal(“1238126387123.1234”); 

Para facilitar la inicialización, la clase BigDecimal tiene algunas constantes predefinidas:

A = BigDecimal.ONE;
// Other than this, available constants
// are BigDecimal.ZERO and BigDecimal.TEN 

Operaciones matemáticas:

int c = a + b;
BigDecimal C = A.add(B); 
Other similar function are subtract() , multiply(), divide(), pow()

Pero todas estas funciones, excepto pow () que toma integer como argumento, toman BigDecimal como argumento, así que si queremos estas operaciones con decimales o cadenas, conviértalas a BigDecimal antes de pasarlas a funciones como se muestra a continuación:

String str = “123456789.123456789”;
BigDecimal C = A.add(new BigBigDecimal(str));
double val  = 123456789.123456789;
BigDecimal C = A.add(BigDecimal.valueOf(val)); 

Extracción de valor de BigDecimal:

// value should be in limit of double x
double x   =  A.doubleValue();   

// To get string representation of BigDecimal A
String z = A.toString();       

Comparación:

if (a < b) {}         // For primitive double
if (A.compareTo(B) < 0)  {} // For BigDecimal

En realidad compareTo devuelve -1 (menor que), 0 (Igual), 1 (mayor que) según los valores.

Para la igualdad también podemos usar:

if (A.equals(B)) {}  // A is equal to B 

Métodos de la clase BigDecimal:

  1. BigDecimal abs (): Este método devuelve un BigDecimal cuyo valor es el valor absoluto de este BigDecimal, y cuya escala es this.scale ().
  2. BigDecimal abs (MathContext mc): Este método devuelve un BigDecimal cuyo valor es el valor absoluto de este BigDecimal, con redondeo de acuerdo con la configuración del contexto.
  3. BigDecimal agregar (BigDecimal augend): Este método devuelve un BigDecimal cuyo valor es (this + augend), y cuya escala es max (this.scale (), augend.scale ()).
  4. BigDecimal agregar (BigDecimal augend, MathContext mc): Este método devuelve un BigDecimal cuyo valor es (this + augend), con redondeo de acuerdo con la configuración del contexto.
  5. byte byteValueExact (): Este método convierte este BigDecimal en un byte, comprobando la pérdida de información.
  6. int compareTo (BigDecimal val): Este método compara este BigDecimal con el BigDecimal especificado.
  7. División BigDecimal (divisor BigDecimal): Este método devuelve un BigDecimal cuyo valor es (this / divisor), y cuya escala preferida es (this.scale () – divisor.scale ()); si no se puede representar el cociente exacto (porque tiene una expansión decimal no terminante) se lanza una ArithmeticException.
  8. BigDecimal divide (divisor BigDecimal, escala int, RoundingMode roundingMode): Este método devuelve un BigDecimal cuyo valor es (este / divisor) y cuya escala es la especificada.
  9. División BigDecimal (divisor BigDecimal, MathContext mc): Este método devuelve un BigDecimal cuyo valor es (este / divisor), con redondeo de acuerdo con la configuración del contexto.
  10. BigDecimal divide (divisor BigDecimal, RoundingMode roundingMode): Este método devuelve un BigDecimal cuyo valor es (este / divisor) y cuya escala es this.scale ().
  11. BigDecimal[] divideAndRemainder (divisor BigDecimal): Este método devuelve una matriz BigDecimal de dos elementos que contiene el resultado de divideToIntegralValue seguido del resultado del resto en los dos operandos.
  12. BigDecimal[] divideAndRemainder (divisor BigDecimal, MathContext mc): Este método devuelve una matriz BigDecimal de dos elementos que contiene el resultado de divideToIntegralValue seguido del resultado del resto en los dos operandos calculados con redondeo de acuerdo con la configuración del contexto.
  13. BigDecimal divideToIntegralValue (divisor BigDecimal): Este método devuelve un BigDecimal cuyo valor es la parte entera del cociente (este / divisor) redondeado hacia abajo.
  14. BigDecimal divideToIntegralValue (divisor BigDecimal, MathContext mc): Este método devuelve un BigDecimal cuyo valor es la parte entera de (este / divisor).
  15. double doubleValue (): Este método convierte este BigDecimal en un doble.
  16. booleano es igual a (Objeto x): Este método compara este BigDecimal con el objeto especificado para la igualdad.
  17. float floatValue (): Este método convierte este BigDecimal en un flotante.
  18. int hashCode (): Este método devuelve el código hash para este BigDecimal.
  19. int intValue (): Este método convierte este BigDecimal en un int.
  20. int intValueExact (): Este método convierte este BigDecimal en un int, comprobando la pérdida de información.
  21. long longValue (): Este método convierte este BigDecimal en un long.
  22. long longValueExact (): Este método convierte este BigDecimal en un largo, comprobando la pérdida de información.
  23. BigDecimal max (BigDecimal val): Este método devuelve el máximo de este BigDecimal y val.
  24. BigDecimal min (BigDecimal val): Este método devuelve el mínimo de este BigDecimal y val.
  25. BigDecimal movePointLeft (int n): Este método devuelve un BigDecimal que es equivalente a este con el punto decimal movido n lugares a la izquierda.
  26. BigDecimal movePointRight (int n): Este método devuelve un BigDecimal que es equivalente a este con el punto decimal movido n lugares a la derecha.
  27. Multiplicar BigDecimal (multiplicando BigDecimal): Este método devuelve un BigDecimal cuyo valor es (este × multiplicando), y cuya escala es (this.scale () + multiplicand.scale ()).
  28. Multiplicar BigDecimal (Multiplicando BigDecimal, MathContext mc): Este método devuelve un BigDecimal cuyo valor es (este × multiplicando), con redondeo de acuerdo con la configuración del contexto.
  29. Negar BigDecimal (): Este método devuelve un BigDecimal cuyo valor es (-this), y cuya escala es this.scale ().
  30. Negar BigDecimal (MathContext mc): Este método devuelve un BigDecimal cuyo valor es (-este), con redondeo de acuerdo con la configuración del contexto.
  31. BigDecimal más (): Este método devuelve un BigDecimal cuyo valor es (+ this), y cuya escala es this.scale ().
  32. BigDecimal más (MathContext mc): Este método devuelve un BigDecimal cuyo valor es (+ this), con redondeo de acuerdo con la configuración del contexto.
  33. Pow BigDecimal (int n): Este método devuelve un BigDecimal cuyo valor es (thisn). La potencia se calcula exactamente, con una precisión ilimitada.
  34. Pow BigDecimal (int n, MathContext mc): Este método devuelve un BigDecimal cuyo valor es (thisn).
  35. int precisión (): Este método devuelve la precisión de este BigDecimal.
  36. Resto BigDecimal (divisor BigDecimal): Este método devuelve un BigDecimal cuyo valor es (este% divisor).
  37. Resto BigDecimal (divisor BigDecimal, MathContext mc): Este método devuelve un BigDecimal cuyo valor es (este divisor de%), con redondeo de acuerdo con la configuración del contexto.
  38. Ronda BigDecimal (MathContext mc): Este método devuelve un BigDecimal redondeado de acuerdo con la configuración de MathContext.
  39. escala int (): Este método devuelve la escala de este BigDecimal.
  40. BigDecimal scaleByPowerOfTen (int n): Este método devuelve un BigDecimal cuyo valor numérico es igual a (este * 10n).
  41. BigDecimal setScale (int newScale): Este método devuelve un BigDecimal cuya escala es el valor especificado y cuyo valor es numéricamente igual a este BigDecimal.
  42. BigDecimal setScale (int newScale, RoundingMode roundingMode): Este método devuelve un BigDecimal cuya escala es el valor especificado, y cuyo valor sin escala se determina multiplicando o dividiendo el valor sin escalar de este BigDecimal por la potencia apropiada de diez para mantener su valor general.
  43. short shortValueExact (): Este método convierte este BigDecimal en un corto, buscando información perdida.
  44. int signum (): Este método devuelve la función signum de este BigDecimal.
  45. BigDecimal sqrt (MathContext mc): Este método devuelve una aproximación a la raíz cuadrada de esto con redondeo de acuerdo con la configuración del contexto.
  46. BigDecimal stripTrailingZeros (): Este método devuelve un BigDecimal que es numéricamente igual a este pero con los ceros finales eliminados de la representación.
  47. Restar BigDecimal (sustraendo BigDecimal): Este método devuelve un BigDecimal cuyo valor es (este – sustraendo), y cuya escala es …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *