чтобы преобразовать -1.0D в Double, лучший способ нас обычно использовать Double.valueOf (-1.0D) , Класс Double кэширует результаты вызовов valueOf, чтобы вы не всегда создавали новый объект в куче. Но еще лучше - конвертировать в двойной, что дешевле. Используйте out.doubleValue()
, чтобы получить значение как двойное. Единственное предостережение заключается в том, что это может быть null, что является отдельным случаем, который, вероятно, стоит обнаружить сам по себе.
Вы также должны быть осторожны с неточностями с плавающей запятой при проверке прямого равенства таким образом. Два числа, которые теоретически равны, могут не иметь представлений, которые в точности равны, поскольку в большинстве операций с плавающей запятой имеется некоторая ошибка округления. Простое решение, которое будет работать в этом случае, чтобы проверить, если разность меньше некоторой дельта:
assertTrue(Math.abs(-1.0D-out.doubleValue()) < delta);
Вы также можете использовать удобный метод JUnit для делать именно это:
assertEquals(-1.0d, out.doubleValue(), delta);
Используйте очень небольшое значение для delta, например 10E-10, или что-то подходящее для вашего приложения. В самом общем случае, если вы не знаете диапазон значений вы сравниваете, вы должны умножить дельту относительного размером каждого числа, например:
double tDelta = delta*(Math.abs(-1.0D)+Math.abs(out.doubleValue()));
assertEquals(-1.0d, out.doubleValue(), tDelta);
Если вы сравнивая очень большие цифры, вы хотите, чтобы разрешенная дельта была больше, и если вы сравниваете очень маленькие числа, вы хотите, чтобы разрешенная дельта была меньше. Но для вашего случая вы заранее знаете один из своих параметров, поэтому можете просто перекодировать дельта.
Причина, по которой это не работает, заключается в том, что она пытается вычесть 1.0D из «Double», который не может быть разрешен. – Epaga 2008-10-22 06:46:38