Относительно BigDecimal - PullRequest
       11

Относительно BigDecimal

2 голосов
/ 09 марта 2010

я делаю приведенную ниже команду печати Java для этой двойной переменной двойной тест = 58,15; Когда я делаю System.out.println (тест); и System.out.println (новый Double (тест) .toString ()); Печатается как 58.15.

Когда я делаю System.out.println (новый BigDecimal (тест)), я получаю следующее значение 58.14999999999999857891452847979962825775146484375

Я могу понять, что значение "test" двойной переменной внутренне хранится как 58.1499999. Но когда я делаю следующие два System.out.println, я получаю выходные данные как 58.15, а не 58.1499999.

System.out.println (тест);

System.out.println (новый Double (тест) .toString ());

Выводит выходные данные как 58.15 для двух вышеупомянутых.

Вышеуказанные операторы System.out.println выполняют некоторое округление значения 58.1499999 и печатают его как 58.15?

Ответы [ 3 ]

5 голосов
/ 09 марта 2010
System.out.println(new BigDecimal("58.15"));

Чтобы создать BigDecimal из жестко закодированной константы, вы всегда должны использовать одну из констант в классе ( ZERO , ONE или TEN ) или один из строковых конструкторов. Причина в том, что если вы поместите значение в двойное число, вы уже потеряли точность, которую никогда не восстановить.

РЕДАКТИРОВАТЬ: полиген смазочных материалов является правильным. В частности, вы используете Double.toString или эквивалентный. Цитировать оттуда:

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

3 голосов
/ 09 марта 2010

Да, println (или, точнее, Double.toString) раундов. Для доказательства System.out.println(.1D); печатает 0.1, что невозможно представить в двоичном формате.

Кроме того, при использовании BigDecimal не используйте конструктор double, поскольку он будет пытаться точно представить неточное значение. Вместо этого используйте конструктор String.

1 голос
/ 09 марта 2010

out.println и Double.toString() используют формат, указанный в Double.toString (double) .

BigDecimal по умолчанию использует больше точности, как описано в javadoc , и когда вы вызываете toString(), он выводит все символы до уровня точности, доступного для примитивного двойника, поскольку иметь точное двоичное представление.

...