Ответ 1
Guava имеет DoubleMath.fuzzyCompare()
.
Существуют ли какие-либо java-библиотеки для двойного сравнения? например.
public static boolean greaterThanOrEqual(double a, double b, double epsilon){
return a - b > -epsilon;
}
Каждый проект, который я запускаю, в конечном итоге перепрограммировал это и скопировал код и проверил.
NB - хороший пример того, почему лучше использовать сторонние JAR-серверы - IBM рекомендует следующее:
"Если вы не знаете масштаб базовых измерений, используйте тест" abs (a/b - 1) < epsilon ", вероятно, будет более надежным, чем просто сравнивая разницу"
Я сомневаюсь, что многие люди подумали об этом и проиллюстрируют, что даже простой код может быть субоптимальным.
Guava имеет DoubleMath.fuzzyCompare()
.
В стандартной библиотеке Java нет методов для решения вашей проблемы. Я предлагаю вам следовать ссылке Joachim и использовать эту библиотеку, которая подходит для ваших нужд, хотя мое предложение было бы создать библиотеку utils, в которой вы мог бы добавить часто используемые методы, как тот, который вы указали в своем вопросе, а также для различных вариантов реализации вашей проблемы вы должны рассмотреть вопрос:
Не стесняйтесь задавать любые другие двусмысленности
Вы должны воздерживаться от любой библиотеки, использующей наивный подход "максимальной абсолютной разницы" (например, Guava). Как подробно описано в статье Брюса Доусона, Сравнивая числа с плавающей запятой, издание 2012 года, оно сильно подвержено ошибкам, поскольку оно работает только в очень ограниченном диапазоне значений. Гораздо более надежный подход заключается в использовании относительных различий или ULP для приблизительных сравнений.
Единственная библиотека, которую я знаю, реализует правильный примерный алгоритм сравнения apache.common.math
.