Почему мой метод equals возвращает true для одних эквивалентных дробей и false для других?

Итак, у меня есть переопределенный метод 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 для нормализации дробей. Опять же, проверка на равенство является тавтологией, поэтому она должна возвращать значение false, только если Object obj не является экземпляром Fraction, однако в случае f1 = 3/5, f2 = 6/10 и f3 = -5/3 ответ возвращается ложным. Тест, который я написал в конце, чтобы увидеть, действительно ли они возвращаются по-другому, показал, что они оба составляют 34/25. Так почему же метод equals работает для большинства наборов дробей, но не для них?

2 ответа

Решение

Решение проблемы было невероятно простым, я не знаю, почему мысль не пришла мне в голову раньше. Я просто изменил оператор 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;
    }
}

Я предполагаю что Fraction это класс, который вы написали и top означает числитель и bottom, знаменатель, и они оба примитивные типы, такие как int или же float, Вы получите ответ, добавив отладочную распечатку в свой equals метод - посмотрите на значения, которые вы сравниваете (не только Fraction.toString()). Например, при использовании арифметики с плавающей точкой может возникнуть ошибка вычисления. Кроме того, как кто-то указал в комментарии, если вы только уменьшите долю в toString метод (как?), который не будет влиять на equals метод.

Другие вопросы по тегам