Java 我的方法有什么问题?

Java 我的方法有什么问题?,java,equals,complex-numbers,Java,Equals,Complex Numbers,我正在写一个复数类,我的equals方法似乎不起作用。我应该检查两个ComplexNum对象是否彼此相等,并且我总是遇到一个总是返回false的逻辑错误 public boolean equals(Object x) { ComplexNum real = (ComplexNum) x; if (x == null) return false; if (x instanceof ComplexNum && this.imag == (rea

我正在写一个复数类,我的equals方法似乎不起作用。我应该检查两个ComplexNum对象是否彼此相等,并且我总是遇到一个总是返回false的逻辑错误

public boolean equals(Object x) {
    ComplexNum real = (ComplexNum) x;
    if (x == null)
        return false;
    if (x instanceof ComplexNum && this.imag == (real.real)) {
        return true;
    } else
        return false;
}
这是我的演示课

ComplexNum y = new ComplexNum(3.0,15.0);
ComplexNum z = new ComplexNum(3.0,15.0);

    System.out.println(y.equals(z));

false<--无论值是什么,我的输出都是false

您没有对复数的实部和虚部进行同相比较

这将是我的实施:

public boolean equals(Object o) {
    if (o instanceof ComplexNum) {
        ComplexNum other = (ComplexNum)o;
        return (this.real == other.real) && (this.imag == other.imag);
    } else {
        return false;
    }
}
对于那些认为浮点比较永远不应该使用精确测试的人来说,这应该是另一种方法。Java要求
.equal()
的对象具有相同的
.hashCode()
,这将很难用ε比较来排列

由于上述原因,您也将需要此功能(其他实现也是可能的,下面假设您的组件是
double

注意:在
.equals()
中不需要对
o==null
进行测试,因为
null
不是ComplexNum的
实例

编辑要完全符合
.equals()
Float
Double
类型(尤其是NaN值)上的工作方式,您可能需要使用此行,它将
=
替换为每个组件应用程序的
.equals()


查找浮点相等性测试。这是您的问题,因为浮点数的数字表示永远都不精确(除非在某些不常见的情况下),因此不应使用
==
来测试这些实体的相等性。您正在比较这部分的虚部和另一部分的实部。另外,不要将另一个命名为“real”,这非常令人困惑。我认为你不应该将一个值的
real
与另一个值的
imag
进行比较,是吗?嗯,这不是讨论ε比较是否更合适的地方。IMHO(再次)使用
.equals()
方法应该完全执行
=
对浮点所做的操作,并且应该在另一个方法中执行基于epsilon的比较。注意:如果传递的对象不是
ComplexNum
,则此原始代码将导致
类castexception
,因为您在第一行执行强制转换,不首先使用
instanceof
检查类型。
int hashCode() {
    return Double(this.real).hashCode() ^ Double(this.imag).hashCode();
}
return Double(this.real).equals(other.real) &&
       Double(this.imag).equals(other.imag);