How to compare two double values in Java?

后端 未结 7 1353
滥情空心
滥情空心 2020-11-22 13:10

A simple comparison of two double values in Java creates some problems. Let\'s consider the following simple code snippet in Java.

package doublecomparision;         


        
相关标签:
7条回答
  • 2020-11-22 13:46
            int mid = 10;
            for (double j = 2 * mid; j >= 0; j = j - 0.1) {
                if (j == mid) {
                    System.out.println("Never happens"); // is NOT printed
                }
    
                if (Double.compare(j, mid) == 0) {
                    System.out.println("No way!"); // is NOT printed
                }
    
                if (Math.abs(j - mid) < 1e-6) {
                    System.out.println("Ha!"); // printed
                }
            }
            System.out.println("Gotcha!");
    
    0 讨论(0)
  • 2020-11-22 13:49
    double a = 1.000001;
    double b = 0.000001;
    
    System.out.println( a.compareTo(b) );
    

    Returns:

    • -1 : 'a' is numerically less than 'b'.

    • 0 : 'a' is equal to 'b'.

    • 1 : 'a' is greater than 'b'.

    0 讨论(0)
  • 2020-11-22 13:55

    Basically you shouldn't do exact comparisons, you should do something like this:

    double a = 1.000001;
    double b = 0.000001;
    double c = a-b;
    if (Math.abs(c-1.0) <= 0.000001) {...}
    
    0 讨论(0)
  • 2020-11-22 13:56

    You can use Double.compare; It compares the two specified double values.

    0 讨论(0)
  • 2020-11-22 14:02

    Consider this line of code:

    Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL
    

    It returns whether firstDouble is equal to secondDouble. I'm unsure as to whether or not this would work in your exact case (as Kevin pointed out, performing any math on floating points can lead to imprecise results) however I was having difficulties with comparing two double which were, indeed, equal, and yet using the 'compareTo' method didn't return 0.

    I'm just leaving this there in case anyone needs to compare to check if they are indeed equal, and not just similar.

    0 讨论(0)
  • 2020-11-22 14:05

    Instead of using doubles for decimal arithemetic, please use java.math.BigDecimal. It would produce the expected results.

    For reference take a look at this stackoverflow question

    0 讨论(0)
提交回复
热议问题