Problem:
When operating on two double type values, sometimes the result value will be abnormal. For example:
System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100);
Output:
39.989999999999995
0.3399999999999997
3.3000000000000003
0.12300000000000001
Solution:
The simple floating point types float and double in Java cannot be operated on, because this is normal in most cases, but occasionally the problems shown above may occur. This problem is actually not a JAVA bug, because the computer itself is binary, and floating point numbers are actually only approximations. Therefore, when converting from binary to decimal floating point numbers, the accuracy is easily lost, resulting in a decrease in accuracy.
To ensure accuracy, the BigDecimal class must be used, and you cannot directly convert from double to BigDecimal. You must convert double to string and then to BigDecimal. That is to say, the BigDecimal(double val) method cannot be used, and you will find that it has no effect. To use BigDecimal(String val) method. Specific examples are shown below.
Examples of four arithmetic operations of double type:
1. Addition
public static double add(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.add(b2).doubleValue(); }
2. Subtraction
public static double sub(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.subtract(b2).doubleValue(); }
3. Multiplication
public static double mul(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.multiply(b2).doubleValue(); }
4. Division
public static double div(double a1, double b1, int scale) { if (scale < 0) { throw new IllegalArgumentException("error"); } BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
When the scale parameter is not divided, specify the precision.
The solution to the abnormal operation result of double type in Java is all the content shared by the editor. I hope it can give you a reference, and I also hope that everyone will support the PHP Chinese website.
For more related articles on solutions to abnormal double type operation results in Java, please pay attention to the PHP Chinese website!