Дело не в том, что вы на самом деле получаете дополнительную точность, а в том, что поплавок не точно представлял число, на которое вы изначально рассчитывали. Двойной равен , точно представляющий исходное значение с плавающей точкой; toString
показывает «лишние» данные, которые уже присутствовали.
Например (а эти цифры неверны, я просто придумываю) предположим, что у вас было:
float f = 0.1F;
double d = f;
Тогда значение f
может быть ровно 0.100000234523. d
будет иметь точно такое же значение, но когда вы преобразуете его в строку, он будет "доверять", что он точен с большей точностью, поэтому не округлится так рано, и вы увидите "дополнительные цифры" которые уже были там, но скрыты от вас.
Когда вы конвертируете в строку и обратно, вы получаете двойное значение, которое ближе к строковому значению, чем было в оригинальном плавающем значении - но это хорошо , если , вы действительно верите, что Строковое значение - это то, что вы действительно хотели.
Вы уверены, что float / double являются подходящими типами для использования здесь вместо BigDecimal
? Если вы пытаетесь использовать числа с точными десятичными значениями (например, деньги), то BigDecimal
- более подходящий тип IMO.