程序认为两个相等的双精度是不同的

时间:2014-03-20 13:53:09

标签: java compare equals

我比较两个双打:

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

我不明白为什么 - 请告知。

5 个答案:

答案 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)

其中ab是要比较的数字,c是阈值,op>

  

<

这是因为二进制的浮点表示不能直接映射到打印的内容。