тип данных для представления большого десятичного числа в Java - PullRequest
5 голосов
/ 22 октября 2009

Какой тип данных может представлять десятичное число, например "10364055.81".

Если попытаться использовать double:

double d = 10364055.81;

Но когда я пытаюсь напечатать число, оно отображается как " 1.036405581E7 ", чего я не хочу.

Должен ли я использовать BigDecimal? Но он отображается как 10364055.81000000052154064178466796875 . Есть ли какой-либо тип данных, который отображает значения как есть? Также число может быть больше, чем в качестве примера.

Кстати, будет ли использование BigDecimal влиять на производительность приложения? Я мог бы использовать это почти во всех моих DTO.

Ответы [ 4 ]

17 голосов
/ 22 октября 2009

Вы должны использовать BigDecimal - но использовать конструктор String , например ::

new BigDecimal("10364055.81");

Если вы передаете double в BigDecimal, Java должна сначала создать этот двойной тип - и поскольку double не может точно представить большинство десятичных дробей, он действительно создает значение как 10364055.81000000052154064178466796875 и , затем передает его в конструктор BigDecimal. В этом случае BigDecimal не может знать, что вы на самом деле имели в виду версию более широкого круга.

Вообще говоря, использование нестроковых конструкторов BigDecimal следует рассматривать как предупреждение о том, что вы не получаете полного преимущества от класса.

Редактировать - исходя из перечитывания именно того, что вы хотели сделать, мое первоначальное утверждение, вероятно, слишком сильное. BigDecimal - хороший выбор, когда вам нужно точно представить десятичные значения (обработка денег - очевидный выбор, вы не хотите, чтобы 5,99 * миллион был, например, 5990016.45.

Но если вас не беспокоит, что число сохраняется внутри как значение, немного отличающееся от введенного вами десятичного литерала, и вы просто хотите снова распечатать его в том же формате, а затем другие говорили, что экземпляр NumberFormat (в данном случае new DecimalFormat("########.##")) сделает хороший вывод двойного значения, или String.format может сделать то же самое.

Что касается производительности - BigDecimals, естественно, будет работать медленнее, чем примитивы. Однако, как правило, если в подавляющем большинстве вашей программы нет математических манипуляций, вы вряд ли заметите разницу в скорости. Это не значит, что вы должны использовать BigDecimals повсюду; скорее, если вы сможете получить реальную выгоду от их функций, которые было бы трудно или невозможно реализовать с помощью простого doubles, то не пренебрегайте крошечной разницей в производительности, которую они теоретически вводят.

3 голосов
/ 22 октября 2009

То, как отображается число, отличается от от того, как хранится число.

Взгляните на DecimalFormat для контроля того, как вы можете отображать свои числа, когда двойные (или плавающие и т.д.)

Обратите внимание, что выбор BigDecimal вместо double (или наоборот) имеет свои плюсы и минусы и будет зависеть от ваших требований. Смотрите здесь для получения дополнительной информации. Из резюме:

В итоге, если сырье и производительность пространство являются наиболее важными факторами, примитивные типы с плавающей точкой подходящее. Если десятичные значения нужно быть представленным точно, с высокой точностью нужен расчет или точный контроль из округления желательно, только BigDecimal имеет необходимый Возможности.

1 голос
/ 22 октября 2009

Вы можете использовать double и отображать, если с System.out.printf ().

double d = 100003.81;
System.out.printf("%.10f", d);

.10f - означает двойной с точностью до 10

1 голос
/ 22 октября 2009

Двойного будет достаточно, чтобы сохранить это число. Если ваша проблема в том, что вам не нравится формат при печати или помещении его в строку, вы можете использовать NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

...