Home  >  Article  >  Java  >  Solution to abnormal double type operation result in java

Solution to abnormal double type operation result in java

高洛峰
高洛峰Original
2017-01-23 16:08:322177browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn