Как избежать хранения значений Double в формате 1Ex? - PullRequest
3 голосов
/ 28 июля 2011

У меня двойная переменная:

private double b=0.0;

Я беру значение определенного поля в b (значение от 0,0 до 9,999999999).В основном, пользователь вводит значение в диапазоне от 0,0 до 1,0.

Когда я сохраняю значение от пользователя в «b», а если значение равно 0,000001, оно сохраняется как 1E-6, а в следующий раз отображается както же самое на экране (это потому, что b - Double).

Есть ли какой-либо способ (просто путем вызова какого-либо метода) в Java, чтобы я мог избежать преобразования значения в формат 1E-6?Я хочу сохранить значение, введенное только пользователем (0,000001).

Ответы [ 2 ]

12 голосов
/ 28 июля 2011

Двойник на самом деле вообще не «сохраняется» как строка. Это просто вопрос форматирования, для которого вы должны увидеть DecimalFormat. Однако, это точно не будет точно 0.000001, потому что это число не может быть точно представлено как двойное число. Я бы настоятельно рекомендовал бы использовать BigDecimal вместо этого, когда точные десятичные значения имеют значение (как это звучит здесь).

2 голосов
/ 28 июля 2011

Это правда, что число не сохраняется в памяти с использованием научной (E) записи.

Вы можете продемонстрировать это себе, отформатировав число по-разному при его выводе:

@Test
public void testLittle() {
    double myNum = 0.000001;
    System.out.printf("%f \n",myNum);
}

Вам определенно следует прислушаться к другим советам, размещенным здесь в ответах, и использовать BigDecimal , если вы действительно хотите, чтобы выходные данные соответствовали входным, поскольку некоторые значения с плавающей точкой не соответствуют вашим представлениям при их представлении.в компьютере.(ref: IEEE-754 )

Презентации "Java Puzzlers" иногда обсуждают это странное поведение и всегда являются интересным способом изучения.(См. этот доклад из Google I / O 2011 , через несколько минут)

...