Introducción a BigDecimal
La explicación en el documento JDK (chino) es la siguiente:
Número decimal inmutable, firmado de precisión arbitraria. BigDecimal consiste en un valor entero no escala de cualquier precisión y una escala entera de 32 bits. Si es cero o positivo, la escala es el número de dígitos después del punto decimal. Si se trata de un número negativo, multiplique el valor no escala del número por una potencia de escala negativa de 10. Por lo tanto, el valor representado por BigDecimal es (sin calificar el valor × 10 a escala).
Explicación específica
1. "El valor del objeto BigDecimal es inmutable". Esto muestra esta característica en la función de operación del objeto BigDecimal:
La copia del código es la siguiente: BigDecimal a = new BigDecimal ("1.22");
System.out.println ("Construye con un valor de cadena:" + a);
BigDecimal b = new BigDecimal ("2.22");
A.Add (b);
System.out.println ("A Plus B es:" + A);
Es fácil pensar que saldrá:
Construya con un StringValue: 1.22
A Plus B es: 3.44
Pero de hecho, un plus B es: 1.22
2. "BigDecimal consiste en un valor entero no escala de cualquier precisión y una escala entera de 32 bits. Si el valor de la escala es cero o positivo, la escala es el número de dígitos después del punto decimal". Esta oración se puede leer así:
Por ejemplo: -12 y 13.412
Expresado como: -12 × 10-0 y 13412 × 10-3
Aquí (valores y escalas sin escala) se representan como: [-12, 0] y [13412, 3] respectivamente
3. "Si el valor de escala es un número negativo, multiplique el valor no a escala del número por una potencia de escala negativa de 10". Esta oración se puede leer así:
Por ejemplo: 120.00
Este valor se expresa como: 12000 × 10-2
Aquí (valor y escala no escala) se expresan como: [12000, 2]
El valor de la escala aquí sigue siendo positivo 2, pero realiza las siguientes operaciones:
Cantidad bigDecimal = new BigDecimal ("-120.00");
// Devuelve BigDecimal numérico igual a este decimal, pero elimina todos los ceros de cola de esta representación.
cantidad = monta.StripTrailingReros ();
Este valor se expresa como: 12 × 10-(-1)
Aquí (valor y escala no escala) se expresan como: [12, -1]
Notas sobre el uso
1. Constructor
La copia del código es la siguiente: BigDecimal Adouble = new BigDecimal (1.22);
System.out.println ("Construye con un valor doble:" + Adouble);
BigDecimal Astring = new BigDecimal ("1.22");
System.out.println ("Construye con un valor de cadena:" + astring);
El resultado de salida es el siguiente:
Construya con un doble valor: 1.219999999999999999997335464474089962430298328399658203125
construir con un valor de cadena: 1.22
Descripción de JDK:
a) Los resultados del método de construcción con el tipo de parámetro doble son impredecibles. Algunas personas podrían pensar que el BigDecimal creado al escribir NewBigDecimal (0.1) en Java es exactamente igual a 0.1 (valor sin escala 1, cuya escala es 1), pero en realidad es igual a 0.10000000000000000000000000555511151231257827021181583404541015625. Esto se debe a que 0.1 no se puede expresar con precisión como un doble (o para este caso no puede expresarse como cualquier decimal binario de longitud finita). De esta manera, el valor pasado en el método de construcción no será exactamente igual a 0.1 (aunque es una superficie igual a ese valor).
b) Por otro lado, el constructor de cadenas es completamente predecible: escribir a newBigDecimal ("0.1") creará un BigDecimal, que es exactamente el 0.1 esperado. Por lo tanto, en comparación, generalmente se recomienda usar el constructor de cadenas primero.
c) Cuando el doble debe usarse como fuente de BigDecimal, tenga en cuenta que este constructor proporciona una conversión precisa; No proporciona el mismo resultado que: primero use el método Double.ToString (doble), luego use el constructor BigDecimal (String). Para convertir el doble en cadena, también puede usar el método estático de la cadena: String.ValueOf (doble).
2. Operación. Además, la resta, la multiplicación y la división realmente devuelven un nuevo objeto BigDecimal, porque BigDecimal es inmutable, y se generará un nuevo objeto al realizar cada paso de operación, por lo que A.Add (b); Aunque se realiza la operación de adición, A no guarda el valor después de la operación de adición. El uso correcto debe ser a = a.Add (b);
ejemplo:
Determine si el objeto BigDecimal es un entero:
Copie el código de la siguiente manera: boolean privado isInteGerValue (BigDecimal BD) {
return bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). scale () <= 0;
}
¿Por qué hacer esto? Pruebe el siguiente ejemplo:
Copie el código de la siguiente manera: BigDecimal cantidad = new BigDecimal ("-120.00"); // por favor intente "0", "0.00", "1.00", "10.00" y "10.10" respectivamente
System.out.println (montre.signum ()); // positivo y negativo
System.out.println (montre.scale ()); //Escala
System.out.println (montre.striptrailingros (). Scale ()); // escala después de cero
Referencia: Clase BigDecimal