0

当我运行这段代码时,为什么不显示“好”这个词?存储在 Array1 和 Array2 的位置 0 中的值对于两者都是 1。

public class ArrayStuff {

    public static void main(String[] args) {

        double value = 1;

        Double[] Array1 = new Double[10];
        Array1 = new Double[] {1.0};

        Double[] Array2 = new Double[10];

        Array2[0] = value;

        int i = 0;

        System.out.println(Array1[0]);
        System.out.println(Array2[i]);

        if (Array1[0] == Array2[i])
        {

            System.out.println("good");

        }
     }

}
4

4 回答 4

5

在 Java 中,当有人问

Double d1 = ...;
Double d2 = ...;
if (d1 == d2) {
    System.out.println("Equal");
} else {
    System.out.println("Not Equal");
}

JRE 不会拆箱Double对象,因此它会检查两个Doubles 是否是同一个确切的对象。在这里,他们不是。注意这两个代码块之间的区别:

Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
if (i1 == i2) {
    System.out.println("Equal");
} else {
    System.out.println("Not Equal");
}

Integer i1 = Integer.valueOf(1);
Integer i2 = Integer.valueOf(1);
if (i1 == i2) {
    System.out.println("Equal");
} else {
    System.out.println("Not Equal");
}

第二个版本重用该Integer对象,因此第一个打印Not Equal,第二个打印Equal

于 2013-10-13T02:07:24.913 回答
3

您正在学习计算机无法以精确的精度表示浮点数。解决方案是使用找到“足够接近”的浮点解决方案的代码,或者使用十进制数的代码。

于 2013-10-13T01:58:51.317 回答
1

因为有限精度数有其局限性,尤其是在比较它们是否完全相等方面。

您应该通过检查 to 值之间的差异是否小于某个阈值来解决问题:

public final double EPSILON = 0.001;

if (Math.abs(Array1[0] - Array2[i]) < EPSILON)
 ...
于 2013-10-13T02:01:17.737 回答
0

你的第一个变量必须是双倍的吗?我的意思是用一个 int 来解决这个问题。

这就提出了一个问题:这一行实际上是创建了具有 10 个插槽的数组并将第一个值:1.0 分配给数组中的 0 插槽还是无法正确创建数组?

 Double[] Array1 = new Double[10];
    Array1 = new Double[] {1.0};  

如果不是,那么这就是原因,下面的代码对您不起作用。没有向你展示“好”这个词。

   if (Array1[0] == Array2[i])
    {

        System.out.println("good");

    }

...但是,也许如果您将第一个变量中的值更改为 1.0 ...但是比较双精度数是不一样的.. 不推荐。

Double Value = 1.0; 
于 2013-10-13T02:13:37.433 回答