gpt4 book ai didi

java - 比较 Double 类型的对象时出错?

转载 作者:行者123 更新时间:2023-12-02 11:07:25 24 4
gpt4 key购买 nike

这个问题出现在这段代码(二分搜索的实现)之后。如果有人能告诉我为什么这没有输出预期的答案,我将不胜感激:

public static void main(String[] args){
Double[] array = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
BinarySearch s = new BinarySearch(array);
System.out.println(s.searchNextHighest(2.0));
}

public BinarySearch(Double[] array){
numbers = array;
}

public Integer searchNextHighest(Double y){
return binarySearchNextHighest(0, numbers.length-1, y, numbers);
}

public Integer binarySearchNextHighest(int min, int max, Double target, Double[] array){
int mid = (min+max)/2;

if(target==array[mid]){ //Fails here
return mid;
}

if(max<min){
if(min>=array.length) return null;
return mid;
}

if(target>array[mid]){
return binarySearchNextHighest(mid+1, max, target, array);
}else{
return binarySearchNextHighest(min, mid-1, target, array);
}
}

输出: 1

我通过调试器进行了跟踪并绝对确定。在某个时刻,target = 2.0,mid=2,array[mid] = 2.0。但 if 语句并未执行。

奇怪的是,使用整数数组/目标时不会发生此错误。

这里发生了什么?我认为这些事情只有在比较非常大的数字时才会发生。还存在哪些其他陷阱?

[编辑]这是一个简化版本:

public static void main(String[] args){
Double[] array = {2.0};
Double target = 2.0;
if(array[0] == target) System.out.println("Yay!");
}

输出:无

[编辑2]

public static void main(String[] args){
double[] array = {3.0};
double target = 3.0;
if(array[0] == target) System.out.println("Yay!");
}

输出:耶!

有人在评论中指出这个错误是比较对象的结果。为什么不自动解压?

[EDIT3] 这是使用 Integer 对象的代码:

public static void main(String[] args){
Integer[] array = {3};
Integer target = 3;
if(array[0] == target) System.out.println("Yay!");
}

输出:耶!

所以我想原因很明显,但是为什么 Integer 对象的实现如此不同呢?这会自动解压。

最佳答案

doubleDouble 是两个不同的东西。 Double 创建一个对象,如果它们指向内存中的相同地址,则它们将相等。它们持有的值可以相同,但它们是不同的对象,因此不相等。与整数相同。对于您的代码,您可以使用 double 代替,或者通过 .doubleValue().equals() 方法对 Double 进行比较> 比较值。

编辑:正如 @MarkPeters 和 @TedHopp 在评论中指出的,Integer 的行为有点不同,更多信息 here .

关于java - 比较 Double 类型的对象时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com