Точность для Double.parseDouble() и String.valueOf()

Верно ли следующее утверждение для любого double (примитив Java с двойной точностью IEEE-754), кроме NaN:

Double.parseDouble(String.valueOf(d)) == d

Иными словами, всегда ли анализ сериализованного (с использованием String.valueOf()) двойного значения дает точное исходное двойное значение?


person gawi    schedule 28.06.2012    source источник


Ответы (1)


За исключением NaN, как вы сказали, да, этот инвариант должен выполняться. Если нет, то это ошибка JDK.

Double.toString говорит об этом в своем Javadoc:

Сколько цифр нужно напечатать для обозначения дробной части m или a? Должна быть по крайней мере одна цифра для представления дробной части, а кроме того, столько же, но только столько дополнительных цифр, сколько необходимо, чтобы однозначно отличить значение аргумента от соседних значений типа double. То есть предположим, что x является точным математическим значением, представленным десятичным представлением, полученным этим методом для конечного отличного от нуля аргумента d. Тогда d должно быть двойным значением, ближайшим к x; или если два значения типа double одинаково близки к x, то d должно быть одним из них, а младший значащий бит мантиссы d должен быть равен 0.

Подводя итог, можно сказать, что он возвращает достаточно цифр для уникальной идентификации этого двойного числа, поэтому Double.parseDouble должно возвращать точно такое же двойное число, которое было преобразовано в строку.

person Louis Wasserman    schedule 28.06.2012