Mira el código primero
System.out.println(0.2 + 0.1);
System.out.println(0.3 - 0.1);
System.out.println(0.2 * 0.1);
System.out.println(0.3 / 0.1);
输出:
0.30000000000000004
0.19999999999999998
0.020000000000000004
2.9999999999999996
La razón del código que se muestra arriba es que nuestra computadora es binaria y no hay forma de que los números de punto flotante se representen con precisión en binario, por lo tanto, algunos números tienen los errores anteriores cuando se calculan.
Hay un problema de pérdida de precisión en el proceso de cálculo. En el proceso de desarrollo, especialmente cuando el objetivo es la industria financiera, esta precisión existente es realmente muy grave. En este momento, BigDecimal descubrió. La clase de API BigDecimal proporcionada por Java en el paquete java.math se utiliza para realizar operaciones precisas en números con más de 16 dígitos significativos. La variable de punto flotante de doble precisión double puede manejar 16 dígitos significativos. En aplicaciones prácticas, es necesario realizar operaciones y procesamiento en números mayores o menores. Float y double solo se pueden usar para cálculos científicos o cálculos de ingeniería. Java.math.BigDecimal debe usarse en cálculos comerciales. Pero lo que BigDecimal crea es un objeto. No podemos usar operadores aritméticos tradicionales como +, -, *, / para realizar operaciones matemáticas directamente en el objeto, sino que debemos llamar a su método correspondiente. Los parámetros del método también deben ser objetos de BigDecimal. Constructor es un método especial de la clase, especialmente utilizado para crear objetos, especialmente objetos con parámetros.
Método de construcción
BigDecimal tiene muchos métodos de construcción, aquí hay algunos de uso común.
BigDecimal (int) convierte el tipo int en un objeto BigDecimal
BigDecimal (String) convierte el tipo de cadena en un objeto BigDecimal
BigDecimal intBigDecimal = new BigDecimal(1111111111);
System.out.println("intBigDecimal "+intBigDecimal);
BigDecimal strBigDecimal = new BigDecimal("11111111111111111111111");
System.out.println("strBigDecimal: "+strBigDecimal);
输出:
intBigDecimal 1111111111
strBigDecimal: 11111111111111111111111
BigDecimal también puede convertir BigInteger doble, largo, en objetos BigDecimal, pero debe tenerse en cuenta que no se recomienda utilizar BigDecimal para convertir datos de tipo doble
BigDecimal doubleBigDecimal = new BigDecimal(1.33333);
System.out.println("doubleBigDecimal "+doubleBigDecimal);
输出:
doubleBigDecimal 1.3333299999999999041477849459624849259853363037109375
La solución proporcionada por JDK es utilizar la conversión de formato de cadena para resolver este tipo de problema de pérdida de precisión
BigDecimal temp = new BigDecimal("1.33333");
System.out.println("temp "+temp);
输出:
temp 1.33333
Por lo tanto, generalmente se recomienda utilizar primero el método de construcción String.
Método de operación BigDecimal
En primer lugar, debe estar seguro, BigDecimal no admite + - * / este tipo de operación, tiene su propio método de operación
Operación de adición BigDecimal add (BigDecimal augend)
Operación de resta de restar BigDecimal (sustraendo BigDecimal)
Operación de multiplicación BigDecimal multiply (BigDecimal multiplicand)
Operación de división BigDecimal divide (BigDecimal divisor)
ejemplo:
BigDecimal num1 = new BigDecimal("1.33333");
BigDecimal num2 = new BigDecimal("2.66666");
System.out.println("加:add "+num1.add(num2));
System.out.println("减:subtract "+num1.subtract(num2));
System.out.println("乘:multiply "+num1.multiply(num2));
// num1 除以 num2
System.out.println("除:divide "+num1.divide(num2));
输出:
加:add 3.99999
减:subtract -1.33333
乘:multiply 3.5555377778
除:divide 0.5
Nota: La suma, resta, multiplicación y división en realidad devuelven un nuevo objeto BigDecimal, porque BigInteger y BigDecimal son inmutables, y cada paso de la operación generará un nuevo objeto.
BigDecimal temp = null;
BigDecimal num3 = new BigDecimal("1.33333");
BigDecimal num4 = new BigDecimal("2.66666");
temp = num3.add(num4);
System.out.println("num3: " + num3);
System.out.println("temp: " + temp);
输出:
num3: 1.33333
temp: 3.99999