2016-11-20 2 views
2

Я написал конвертер, который использует Double.parseDouble для преобразования строки в длинное значение. Поскольку пользователь несколько раз вводит ввод в формате xx.xx вместо чистого целочисленного формата. Есть ли возможность потерять информацию при анализе длинного значения с помощью Double.parseDouble?Могу ли я хранить длинное значение точно в двойной переменной без ошибки округления?

static Long toLong(Object object) { 
    if (object == null) { 
     return null; 
    } 
    if (object instanceof Number) { 
     return ((Number) object).longValue(); 
    } 
    return new Double(Double.parseDouble(object.toString().trim())).longValue(); 
} 
+0

Почему бы не попробовать? Введите длинную строку и посмотрите, что произойдет. Таким образом, вы также можете увидеть, сколько информации теряется. – frankenapps

+4

Да, есть. Оба используют 64 бита. Но Double должен иметь возможность хранить десятичные числа, тогда как Long - нет. Очевидно, что Double не может хранить столько точных целых значений, сколько это делает. –

ответ

3

Да.
A double использует только 53 бита для хранения mantissa – фактические цифры в количестве.
Другие 11 бит используются для хранения экспоненты –, где находится десятичное число.

Таким образом, вы не можете точно выразить 64 бита цифр в double.

+2

nitpick, но: «показатель степени - где десятичное число» - из-за двоичного представления показатель показывает, где находится двоичная точка, а не десятичная точка. – davmac

+0

«Да» в этом ответе фактически отвечает на вопрос в описании («Есть ли возможность потерять информацию ...?»), А не вопрос в заголовке («Могу ли я хранить точное значение точно ... ? "). Смущенный мне немного на первый взгляд. – David

Смежные вопросы