我比较两个双打:
37.4238777160645
和
37.4238777160645
但Java并不认为它们是平等的。我正在以下列方式比较它们
if(object1.getLatitude()!=object2.getLatitude()){
fail("objects are not equal "+object1.getLatitude()+":"+object2.getLatitude());
}
导致以下失败:
junit.framework.AssertionFailedError: objects are not equal 37.4238777160645:37.4238777160645
我不明白为什么 - 请告知。
答案 0 :(得分:3)
已经指出了这个问题。但是如果你使用junit,使用适当的方法会更简单:
assertEquals(object1.getLatitude(), object2.getLatitude());
或
assertEquals(object1.getLatitude(), object2.getLatitude(), 0.001d);
而不是使用fail
。这也可以解决你的问题。
答案 1 :(得分:2)
应将对象与.equals
进行比较,而不是==
。通过==
您比较引用,它们不相同,因为您每次都返回一个不同的对象。
使用Double#equals
比较值。
答案 2 :(得分:1)
您应该使用java.lang.Double.compare() :
Double.compare(object1.getLatitude(), object2.getLatitude())
所以你将拥有:
if(Double.compare(object1.getLatitude(), object2.getLatitude()) != 0){
fail("objects are not equal "+object1.getLatitude()+":"+object2.getLatitude());
}
答案 3 :(得分:1)
当应用于对象时,==
运算符仅在两个操作数都是同一对象时才返回true
。
您的方法会返回Double
个对象,因此每个调用都会生成一个新对象,并使用==
进行比较将始终为false
。
使用.equals()
,比较Doubles
的值:
if (!object1.getLatitude().equals(object2.getLatitude()))
或者,更改方法以返回double
而不是Double
,并且您当前的代码将有效。
答案 4 :(得分:0)
may编程语言中的浮点比较应始终采用
的形式if(a-b op c)
其中a
和b
是要比较的数字,c
是阈值,op
是>
或
<
。
这是因为二进制的浮点表示不能直接映射到打印的内容。