为什么我的 equals 方法对某些等效分数返回 true 而对其他分数返回 false?

Why my equals method is returning true for some equivalent fractions and false for others?

所以我有一个重写的 equals 方法和一个允许用户输入多个整数分数的程序,然后检查是否 f1(f2 - f3) = f1f2 - f1f3 。这是一个必要的事实,并且对于 大多数 有效输入都是正确的。这是我的 equals 方法:

@Override
public boolean equals(Object obj)
{
    if(!(obj instanceof Fraction))
    {
        return false;
    }
    else
    {
        Fraction f = (Fraction)obj;
        return top == f.top && bottom == f.bottom;
    }
}

这是测试人员:

    Fraction part1 = F1.multiply(F2.subtract(F3));
    Fraction part2a = F1.multiply(F2);
    Fraction part2b = F1.multiply(F3);
    Fraction part2 = part2a.subtract(part2b);
    System.out.println("Is f1(f2 - f3) equal to f1f2 - f1f3? " + part1.equals(part2));
    System.out.println(part1 + " ?= " + part2);

我还有一个重写的 toString 方法,它使用 GCD 方法对分数进行归一化。同样,等于检查是重言式,因此只有当 Object obj 不是 Fraction 的实例时它才应该返回 false,但是在 f1 = 3/5、f2 = 6/10 和 f3 = -5/3 的情况下,答案返回错误。我在最后写的测试是为了查看它们是否真的以不同的方式返回,结果表明它们都等于 34/25。那么,为什么 equals 方法适用于大多数分数集而不适用于这些分数集?

我假设Fraction是你写的class,top是分子,bottom是分母,都是基本类型,比如intfloat。您将通过在 equals 方法中添加调试打印输出来获得答案——查看您正在比较的值(不仅仅是 Fraction.toString())。例如,如果您使用浮点运算。另外,正如有人在评论中指出的那样,如果您只减少 toString 方法中的分数(如何?),那不会对 equals 方法产生影响。

问题的解决非常简单,我不知道为什么我没有早点想到这个想法。我只是将 return 语句从检查两个分数的分子和分母是否相等改为检查两个分数的叉积是否相等。这是更新后的 equals 方法:

@Override
public boolean equals(Object obj)
{
    if(!(obj instanceof Fraction))
    {
        return false;
    }
    else
    {
        Fraction f = (Fraction)obj;
        return top*f.bottom == bottom*f.top;
    }
}