У меня есть тест junit, утверждающий два объекта Double со следующим:
Assert.assertEquals(Double expected, Double result);
Это было нормально, затем я решил изменить его, чтобы использовать примитив double вместо него, который, как оказалось, устарел, если вы также не предоставляете дельту.
Поэтому мне интересно, в чем разница между использованием объекта Double или примитивного типа в этом assertEquals? Почему использование объектов без дельты нормально, а использование примитивов без дельты устарело? Делает ли Java что-то в фоновом режиме, что уже учитывает значение дельты по умолчанию?
Спасибо.
Двойная математика редко, если вообще когда-либо, дает точно одинаковые результаты. Например, 0.1 * 0.1 != 0.01
. Обычно при сравнении результатов двойной точности требуется хотя бы некоторая дельта.
С другой стороны, если вы сравниваете квадратные Double
, предполагается, что вам нужно точное равенство. В Java не учитывается значение дельты по умолчанию, но Double.equals
имеет несколько иное поведение, чем ==
: в частности, его обработка NaNs.
Это имеет смысл при тестировании, потому что Double.NaN != Double.NaN
, но в тесте, если вы ожидали NaN
и было возвращено NaN
, это будет правильным ответом.
ИСТОЧНИК. Утверждает, что два двойных или плавающих числа равны с точностью до положительной дельты. Если это не так, выдается AssertionError. Если ожидаемое значение равно бесконечности, то значение дельты игнорируется. NaN считаются равными.
Я бы сказал, что сравнение парных чисел, примитивных или объектных, бесполезно без дельты. Знание того, как работают числа с плавающей точкой, является ключом к выполнению числовых операций.
Объект может использовать .equals под прикрытием; у примитива нет другого варианта, кроме ==.
То, что объектная версия не использует дельту, не делает ее лучшей идеей.