如何在 Java 中比较两个双精度值?

Java 中两个双精度值的简单比较会产生一些问题。让我们考虑以下 Java 中的简单代码片段。

package doublecomparision;


final public class DoubleComparision
{
public static void main(String[] args)
{
double a = 1.000001;
double b = 0.000001;


System.out.println("\n"+((a-b)==1.0));
}
}

上面的代码似乎返回 true,即表达式 ((a-b)==1.0)的求值,但它没有返回。它返回 false,因为这个表达式的求值是 0.9999999999999999,实际上应该是 1.0,而 1.0不等于 1.0,因此条件的求值为布尔 false。克服这种情况的最佳和建议的方法是什么?

244768 次浏览

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

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) {...}

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

        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!");

Just use Double.compare() method to compare double values.
Double.compare((d1,d2) == 0)

double d1 = 0.0;
double d2 = 0.0;


System.out.println(Double.compare((d1,d2) == 0))  // true
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'.

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.