La clase BigDecimal proporciona operaciones en números dobles para aritmética, manejo de escalas, redondeo, comparación, conversión de formato y hash. Puede manejar números de punto flotante muy grandes y muy pequeños con gran precisión pero compensando un poco con la complejidad del tiempo.
Un BigDecimal consta de un valor entero sin escala de precisión aleatoria y una escala de enteros 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 escalar 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 coma 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 punto fijo. 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.
// Java Program to illustrate BigDecimal Class import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { // Create two new BigDecimals BigDecimal bd1 = new BigDecimal("124567890.0987654321"); BigDecimal bd2 = new BigDecimal("987654321.123456789"); // Addition of two BigDecimals bd1 = bd1.add(bd2); System.out.println("BigDecimal1 = " + bd1); // Multiplication of two BigDecimals bd1 = bd1.multiply(bd2); System.out.println("BigDecimal1 = " + bd1); // Subtraction of two BigDecimals bd1 = bd1.subtract(bd2); System.out.println("BigDecimal1 = " + bd1); // Division of two BigDecimals bd1 = bd1.divide(bd2); System.out.println("BigDecimal1 = " + bd1); // BigDecima1 raised to the power of 2 bd1 = bd1.pow(2); System.out.println("BigDecimal1 = " + bd1); // Negate value of BigDecimal1 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 string 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 un número entero como argumento, toman BigDecimal como su argumento, por lo que si queremos que estas operaciones con decimales o strings las conviertan 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:
- BigDecimal abs() : este método devuelve un BigDecimal cuyo valor es el valor absoluto de este BigDecimal, y cuya escala es this.scale().
- BigDecimal abs(MathContext mc) : este método devuelve un BigDecimal cuyo valor es el valor absoluto de este BigDecimal, con redondeo según la configuración del contexto.
- BigDecimal add(BigDecimal augend) : este método devuelve un BigDecimal cuyo valor es (this + augend) y cuya escala es max(this.scale(), augend.scale()).
- BigDecimal add(BigDecimal augend, MathContext mc) : Este método devuelve un BigDecimal cuyo valor es (this + augend), con redondeo según la configuración del contexto.
- byte byteValueExact() : este método convierte este BigDecimal en un byte, verificando la información perdida.
- int compareTo(BigDecimal val) : este método compara este BigDecimal con el BigDecimal especificado.
- BigDecimal divide(BigDecimal divisor) : Este método devuelve un BigDecimal cuyo valor es (this / divisor), y cuya escala preferida es (this.scale() – divisor.scale()); si el cociente exacto no se puede representar (porque tiene una expansión decimal no terminante), se lanza una ArithmeticException.
- BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) : este método devuelve un BigDecimal cuyo valor es (this / divisor) y cuya escala es la especificada.
- BigDecimal divide(BigDecimal divisor, MathContext mc) : Este método devuelve un BigDecimal cuyo valor es (this / divisor), con redondeo según la configuración del contexto.
- BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) : Este método devuelve un BigDecimal cuyo valor es (this / divisor), y cuya escala es this.scale().
- BigDecimal[] divideAndRemainder(BigDecimal divisor) : este método devuelve una array BigDecimal de dos elementos que contiene el resultado de divideToIntegralValue seguido del resultado del resto de los dos operandos.
- BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) : este método devuelve una array BigDecimal de dos elementos que contiene el resultado de divideToIntegralValue seguido del resultado del resto de los dos operandos calculados con redondeo según la configuración del contexto.
- BigDecimal divideToIntegralValue(BigDecimal divisor) : Este método devuelve un BigDecimal cuyo valor es la parte entera del cociente (este/divisor) redondeado hacia abajo.
- BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) : este método devuelve un BigDecimal cuyo valor es la parte entera de (this / divisor).
- double doubleValue() : este método convierte este BigDecimal en un doble.
- boolean equals(Object x) : este método compara este BigDecimal con el objeto especificado para la igualdad.
- float floatValue() : este método convierte este BigDecimal en un flotante.
- int hashCode() : este método devuelve el código hash para este BigDecimal.
- int intValue() : este método convierte este BigDecimal en un int.
- int intValueExact() : este método convierte este BigDecimal en un int, verificando la información perdida.
- long longValue() : este método convierte este BigDecimal en un long.
- long longValueExact() : este método convierte este BigDecimal en un largo, verificando la información perdida.
- BigDecimal max(BigDecimal val) : este método devuelve el máximo de este BigDecimal y val.
- BigDecimal min(BigDecimal val) : este método devuelve el mínimo de este BigDecimal y val.
- 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.
- 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.
- BigDecimal multiplicar(BigDecimal multiplicand) : este método devuelve un BigDecimal cuyo valor es (this × multiplicand) y cuya escala es (this.scale() + multiplicand.scale()).
- BigDecimal multiplicar (multiplicando BigDecimal, MathContext mc) : este método devuelve un BigDecimal cuyo valor es (este × multiplicando), con redondeo según la configuración del contexto.
- BigDecimal negate() : este método devuelve un BigDecimal cuyo valor es (-this) y cuya escala es this.scale().
- BigDecimal negate(MathContext mc) : este método devuelve un BigDecimal cuyo valor es (-this), con redondeo según la configuración del contexto.
- BigDecimal plus() : este método devuelve un BigDecimal cuyo valor es (+this) y cuya escala es this.scale().
- BigDecimal plus(MathContext mc) : Este método devuelve un BigDecimal cuyo valor es (+this), con redondeo según la configuración del contexto.
- BigDecimal pow(int n) : este método devuelve un BigDecimal cuyo valor es (thisn), la potencia se calcula exactamente, con una precisión ilimitada.
- BigDecimal pow(int n, MathContext mc) : este método devuelve un BigDecimal cuyo valor es (thisn).
- int precision() : este método devuelve la precisión de este BigDecimal.
- Resto BigDecimal(Divisor BigDecimal) : Este método devuelve un BigDecimal cuyo valor es (este % divisor).
- Resto BigDecimal(Divisor BigDecimal, MathContext mc) : este método devuelve un BigDecimal cuyo valor es (este % divisor), con redondeo según la configuración del contexto.
- BigDecimal round (MathContext mc) : este método devuelve un BigDecimal redondeado de acuerdo con la configuración de MathContext.
- int scale() : este método devuelve la escala de este BigDecimal.
- BigDecimal scaleByPowerOfTen(int n) : Este método devuelve un BigDecimal cuyo valor numérico es igual a (this * 10n).
- BigDecimal setScale(int newScale) : este método devuelve un BigDecimal cuya escala es el valor especificado y cuyo valor es numéricamente igual al de este BigDecimal.
- BigDecimal setScale(int newScale, RoundingMode roundingMode) : este método devuelve un BigDecimal cuya escala es el valor especificado, y cuyo valor sin escalar se determina multiplicando o dividiendo el valor sin escalar de este BigDecimal por la potencia de diez adecuada para mantener su valor general.
- short shortValueExact() : este método convierte este BigDecimal en un short, verificando la información perdida.
- int signum() : este método devuelve la función signum de este BigDecimal.
- BigDecimal sqrt(MathContext mc) : este método devuelve una aproximación a la raíz cuadrada de esto con redondeo según la configuración del contexto.
- 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.
- BigDecimal subtract (sustraendo BigDecimal) : este método devuelve un BigDecimal cuyo valor es (this – sustraendo) y cuya escala es max(this.scale(), subtrahend.scale()).
- BigDecimal subtract (sustraendo BigDecimal, MathContext mc) : este método devuelve un BigDecimal cuyo valor es (este – sustraendo), con redondeo según la configuración del contexto.
- BigInteger toBigInteger() : este método convierte este BigDecimal en un BigInteger.
- BigInteger toBigIntegerExact() : este método convierte este BigDecimal en un BigInteger, buscando información perdida.
- String toEngineeringString() : este método devuelve una representación de string de este BigDecimal, usando notación de ingeniería si se necesita un exponente.
- String toPlainString() : este método devuelve una representación de string de este BigDecimal sin un campo de exponente.
- String toString() : este método devuelve la representación de string de este BigDecimal, usando notación científica si se necesita un exponente.
- BigDecimal ulp() : este método devuelve el tamaño de un ulp, una unidad en último lugar, de este BigDecimal.
- BigInteger unscaledValue() : este método devuelve un BigInteger cuyo valor es el valor sin escalar de este BigDecimal.
- static BigDecimal valueOf(double val) : este método convierte un doble en un BigDecimal, usando la representación de string canónica del doble proporcionada por el método Double.toString(double).
- static BigDecimal valueOf(long val) : este método traduce un valor largo en un BigDecimal con una escala de cero.
- static BigDecimal valueOf(long unscaledVal, int scale) : este método traduce un valor largo sin escalar y una escala int en un BigDecimal.
Para ver más ejemplos, visite Java BigDecimal Ejemplos
Artículos relacionados:
Para más funciones y detalles, consulte Class BigDecimal
Publicación traducida automáticamente
Artículo escrito por MadhuramJajoo y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA