有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java原语双值相等取决于大小?

我必须检查两个双精度值是否相等,包括大小和精度。我遇到了一个奇怪的场景,在这个场景中,原始的双等于检查是不一致的,并且取决于值的大小

我使用过的Java版本:

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)

我的代码:

public class Test{
     public static void main(String args[]) throws Exception{
         String val1 = "15.999999999999999";
         String val2 = "16";
         String val3 = "16.999999999999999";
         String val4 = "17";
         double d1 = Double.parseDouble(val1);
         double d2 = Double.parseDouble(val2);
         double d3 = Double.parseDouble(val3);
         double d4 = Double.parseDouble(val4);
         System.out.println(val1 + "=" + val2 + "? ===>" + (d1==d2));
         System.out.println(val3 + "=" + val4 + "? ===>" + (d3==d4));
     }
}

输出:

15.999999999999999=16? ===>false
16.999999999999999=17? ===>true

共 (3) 个答案

  1. # 2 楼答案

    浮点数是近似值。它们可能有一组有限的离散值。通过解析字符串创建浮点数时,将选择最接近的浮点数来表示它

    最接近15.999999999999的双精度是15.999999999998,而不是16.0,因此比较是不相等的。但是17.0是最接近16.99999999999的两倍,所以它们比较相等

  2. # 3 楼答案

    由于各种无聊和复杂的原因,你试图做的事情不会奏效,你可以在这里读到:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

    除非您要比较double的位表示(这可能是有见地的,也可能不是有见地的),否则您将始终需要某种epsilon值,即在处理数字的浮点表示时的误差范围。比如:

    boolean doublesAreEqual(double d1, double d2)
    {
        double d = d1 / d2;
        return (Math.abs(d - 1.0) < 0.00001 /* epsilon */);
    }