Проверка на равенство с плавающей запятой. (FE_FLOATING_POINT_EQUALITY)

Я использую findbugs в сценарии ANT и не могу понять, как исправить две из моих ошибок. Я прочитал документацию, но не понимаю. Вот мои ошибки и связанный с ними код:

Ошибка 1: Проверка равенства с плавающей запятой. (FE_FLOATING_POINT_EQUALITY)

private boolean equals(final Quantity other) {
    return this.mAmount == convertedAmount(other);
}

Ошибка 2: EQ_COMPARETO_USE_OBJECT_EQUALS

public final int compareTo(final Object other) {
    return this.description().compareTo(((Decision) other).description());
}

Я прочитал документацию по проблеме ComparesTo, в которой говорится

Настоятельно рекомендуется, но не обязательно, чтобы (x.compareTo (y) == 0) = = (x.equals (y)). Вообще говоря, любой класс, реализующий интерфейс Comparable и нарушающий это условие, должен четко указывать на этот факт. Рекомендуемый язык - «Примечание: этот класс имеет естественный порядок, несовместимый с equals.»

, а также документы, касающиеся равенства с плавающей запятой

Эта операция сравнивает два значения с плавающей запятой на равенство. Поскольку вычисления с плавающей запятой могут включать округление, вычисленные значения с плавающей запятой и двойные значения могут быть неточными. Для значений, которые должны быть точными, например денежных значений, рассмотрите возможность использования типа с фиксированной точностью, например BigDecimal. Для значений, которые не должны быть точными, рассмотрите возможность сравнения на равенство в пределах некоторого диапазона, например: if (Math.abs (x - y) <.0000001). См. Спецификацию языка Java, раздел 4.2.4.

Я не понимаю. Кто-нибудь может помочь?

20
задан martin clayton 3 October 2010 в 01:03
поделиться