1. Introducción a BigDecimal
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 ( unscaledValue × 10-scale ).
2. Introducción de BigDecimal
Al usar lenguajes de programación de Java, como la banca y las finanzas, que requieren un cálculo de alta precisión de los valores numéricos, a menudo usamos BigDecimal y BigInteger en lugar de los tipos int , long , float y double comunes, especialmente cuando tratamos con datos de puntos flotantes.
Primero echemos un vistazo a una demostración de código del uso del double de datos básico para los resultados de cálculo e impresión:
Public Class MainClass {public static void main (String [] args) {System.out.println (0.02+0.01); System.out.println (0.05+0.01); }}Los resultados son los siguientes:
0.030.0600000000000000000000005
La pregunta es, ¿por qué aparecen datos con el segundo resultado? La razón fundamental es que nuestra computadora es binaria, y Binary no puede representar con precisión un número de punto flotante. Hay ciertos errores cuando la CPU usa el método "mandril y exponente" (método de notación científica) para expresar números de puntos flotantes. Por lo tanto, cuando los requisitos de precisión de los datos son relativamente altos, la clase BigDecimal aún debe usarse, aunque la velocidad de cálculo es ligeramente más lenta.
3. Uso del poderoso
Hay dos formas de crear un objeto BigDecimal: constructor y método estático público ( BigDecimal.valueOf ). Se deben prestar dos puntos a:
1. El constructor incluye dos formularios que usan tipos de datos básicos y cadenas como parámetros. Se recomienda este último, como: new BigDecimal(Double.valueOf(0.09)) . Puedes probarlo. El resultado de salida System.out.println(new BigDecimal(0.06).toString()); La declaración es: 0.05999999999999999997795539507496869191527366638183593755
2. Cuando Decimal imprima el registro o se convierte en tipos de datos básicos, intente usar el método público xxxValue() proporcionado por él, como doubleValue() , en lugar de una toString()
4. Modo de redondeo BigDecimal
Aunque la base de datos almacena un número de punto flotante de alta precisión, generalmente es necesario limitar el número de dígitos decimales cuando se muestran en aplicaciones, como dos o tres decimales. En este momento, debe utilizar la función SetScale ( int newScale, int roundingMode ). Como una variable estática pública de BigDecimal, existen muchas reglas de operación para el modo de redondeo (modo de redondeo) y hay ocho tipos públicos. Aquí hay una explicación, y el documento oficial también lo presenta.
1. Round_Up
Ronda de cero. Abandon la parte distinta de cero y agregue un número adyacente a la parte distinta de cero.
2. Round_down
Redonda en la dirección cercana a cero. Abandonar la parte distinta de cero, y al mismo tiempo, el número adyacente de la pieza no se descartará agregando una a la parte distinta de cero e interceptando el comportamiento.
3. Round_ceiling
Ronda en la dirección de infinito. Si es un número positivo, el resultado de redondeo es el mismo que Round_Up; Si es un número negativo, el resultado de redondeo es el mismo que Round_down. Nota: Este modo no reduce el tamaño del valor.
4. Round_floor
Ronda en la dirección de infinito negativo. Si es un número positivo, el resultado de redondeo es el mismo que Round_down; Si es un número negativo, el resultado de redondeo es el mismo que Round_UP. Nota: Este modo no aumenta el tamaño del valor.
5. Round_half_up
El redondeo al número "más cercano" es un modo redondeo de redondeo ascendente si la distancia a dos números adyacentes es igual. Si la pieza se descarta> = 0.5, el comportamiento de redondeo es el mismo que Round_Up; De lo contrario, el comportamiento de redondeo es el mismo que Round_down. Este patrón es lo que a menudo llamamos nuestro "redondeo".
6. Round_half_down
El redondeo al número "más cercano", si la distancia a dos números adyacentes es igual, es un modo redondeo de redondeo hacia abajo. Si la parte descartada> 0.5, el comportamiento de redondeo es el mismo que Round_Up; De lo contrario, el comportamiento de redondeo es el mismo que Round_down. Este modelo es lo que a menudo llamamos nuestros "redondeos".
7. Round_half_even
Redondea al número "más cercano", si la distancia a dos números adyacentes es igual, los números pares adyacentes se redondean. Si se descarta el número impar a la izquierda de la pieza, el comportamiento de redondeo es el mismo que Round_half_Up; Si es un número uniforme, el comportamiento de redondeo es el mismo que Round_half_down. Nota: Este modo de redondeo minimiza el error de acumulación cuando se repite una serie de cálculos. Este modo de redondeo también se llama "Método de redondeo banquero" y se utiliza principalmente en los Estados Unidos. Ronda seis en seis, y cinco en dos situaciones. Si el anterior es un número impar, ingresará a la posición, de lo contrario será abandonado.
8. Round_unnecessary
La operación de la solicitud de afirmación tiene resultados precisos, por lo que no se requiere redondeo. Si este modo de redondeo se especifica para una operación que obtiene el resultado exacto, se lanza una arithmeticException.
A continuación, damos un ejemplo para ilustrar los resultados del cálculo numérico en diferentes modos de redondeo, manteniendo un decimal:
5. Resumen
Lo anterior es la introducción completa del BigDecimal y ocho modos de redondeo de Java. Espero que el contenido de este artículo sea útil para todos en el aprendizaje de Java.