-0.0
- это отрицательный ноль , как указано в стандарте IEEE 754 .
Если вам интересно, как может возникнуть такое значение, следующая статья поможет объяснить его: http://www.savrola.com/resources/negative_zero.html
Что касается отказа от значения эпсилона, то именно так и работает Float.compare
(это точное, а не приблизительное сравнение). Ничто не помешает вам иметь другую функцию сравнения, которая делает принимает эпсилон, а выполняет приблизительное сравнение.
Как точное, так и приблизительное сравнение чисел с плавающей запятой имеют свое применение.
Что касается вашего фактического кода, он страдает от ряда проблем:
- это не трехстороннее сравнение, как
Float.compare
;
- не обрабатывает
NaN
с;
- обычно лучше указывать эпсилон как относительное значение, а не как абсолютное, чтобы оно масштабировалось с
f1
и f2
(см. эту статью для обсуждения).
Моя цель здесь не в том, чтобы критиковать ваш код, а в том, чтобы показать, что писать хороший код с плавающей запятой сложнее, чем кажется на первый взгляд.