如何比较Java中的两个double值?

时间:2011-11-10 15:19:33

标签: java

Java中两个double值的简单比较会产生一些问题。让我们考虑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因此,条件求值为boolean {{ 1}}。克服这种情况的最佳和建议的方法是什么?

7 个答案:

答案 0 :(得分:81)

基本上你不应该进行精确的比较,你应该这样做:

double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}

答案 1 :(得分:10)

请使用java.math.BigDecimal,而不是使用双精度进行十进制算术。它会产生预期的结果。

如需参考,请查看此stackoverflow question

答案 2 :(得分:5)

您可以使用Double.compare;它比较了两个指定的双精度值。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

double a = 1.000001;
double b = 0.000001;

System.out.println( a.compareTo(b) );

返回

  • -1:'a'在数值上小于'b'。

  • 0:“ a”等于“ b”。

  • 1:“ a”大于“ b”。

答案 5 :(得分:0)

考虑以下代码行:

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

它返回firstDouble是否等于secondDouble。我不确定这是否适合您的具体情况(正如凯文指出的那样,对浮点数进行任何数学运算都可能导致结果不准确),但是我很难比较两个相等的双精度数,这实际上是相等的,但使用“ compareTo”方法未返回0。

我只是把这个留在那儿,以防有人需要比较以检查它们是否确实相等,而不仅仅是相似。

答案 6 :(得分:-4)

只需使用Double.compare()方法比较双精度值。
Double.compare((d1,d2)== 0)

double d1 = 0.0;
double d2 = 0.0;

System.out.println(Double.compare((d1,d2) == 0))  // true