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

时间:2016-02-23 01:44:19

标签: java methods equals

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

@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方法来标准化分数。同样,等于检查是重言式,所以如果对象obj不是Fraction的实例,它应该只返回false,但是在f1 = 3/5,f2 = 6/10和f3 = -5/3的情况下,答案是假的。我最后在那里写的测试,看看他们是否真的回来了,表明他们都达到了34/25。那么为什么equals方法适用于大多数馏分而不是这些?

2 个答案:

答案 0 :(得分:0)

问题的解决方法非常简单,我不知道为什么这个想法没有早点进入我的脑海。我只是改变了返回语句,检查两个分数的分子和分母是否等于检查两个分数的交叉乘积是否相等。这是更新的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;
    }
}

答案 1 :(得分:-1)

我假设Fraction是您编写的类,top表示分子和bottom,分母,它们都是原始类型,例如{{1} }或int。您将通过在float方法中添加调试打印输出来获得答案 - 查看您要比较的值(不仅仅是equals)。例如,如果您使用,可能会出现计算错误浮点运算。另外,正如有人在评论中指出的那样,如果你只减少Fraction.toString()方法中的分数(如何?),那么这对toString方法不会产生影响。