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

Solution to abnormal double type operation result in java

高洛峰
Release: 2017-01-23 16:08:32
Original
2195 people have browsed it

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);
Copy after login

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();
  }
Copy after login

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();
  }
Copy after login

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();
  }
Copy after login

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();
 }
Copy after login

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!

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template