Тип данных для представления большого десятичного числа в Java
Какой тип данных может представлять десятичное число, например "10364055.81".
Если попытался использовать double:
double d = 10364055.81;
Но когда я пытаюсь напечатать число, оно отображается как " 1.036405581E7 ", чего я не хочу.
Должен ли я использовать BigDecimal? Но он отображается как 10364055.81000000052154064178466796875. Есть ли какой-либо тип данных, который отображает значения как есть? Также число может быть больше, чем в качестве примера.
Кстати, будет ли использование BigDecimal повлиять на производительность приложения? Я мог бы использовать это почти во всех моих DTO.
4 ответа
Вы должны использовать BigDecimal - но использовать конструктор String, например:
new BigDecimal("10364055.81");
Если вы передаете double
в BigDecimal Java должна сначала создать этот double - и так как double не может точно представить большинство десятичных дробей, он создает значение как 10364055.81000000052154064178466796875
азатем передает его в конструктор BigDecimal. В этом случае BigDecimal не может знать, что вы на самом деле имели в виду версию более широкого круга.
Вообще говоря, использование нестроковых конструкторов BigDecimal следует рассматривать как предупреждение о том, что вы не получаете всех преимуществ класса.
Редактировать- основываясь на перечитывании именно того, что вы хотели сделать, мое первоначальное утверждение, вероятно, слишком сильно. BigDecimal - это хороший выбор, когда вам нужно точно представить десятичные значения (обработка денег - очевидный выбор, вы не хотите, чтобы 5,99 * один миллион были5990016.45
например.
Но если вас не беспокоит, что число хранитсявнутри как значение, немного отличающееся от введенного вами десятичного литерала, и вы просто хотите распечатать его снова в том же формате, то, как уже говорили другие, экземпляр NumberFormat
(в этом случае,new DecimalFormat("########.##")
) сделает хороший вывод двойного, или String.format может сделать то же самое.
Что касается производительности - BigDecimal s, естественно, будет медленнее, чем примитивы. Обычно, однако, если подавляющее большинство вашей программы не содержит математических манипуляций, вы вряд ли заметите разницу в скорости. Это не значит, что вы должны использовать BigDecimal s повсюду; скорее, если вы сможете получить реальную выгоду от их функций, которые будет трудно или невозможно реализовать с помощью простого doubles
, тогда не переживайте о незначительной разнице в производительности, которую они теоретически представляют.
Как отображается номер отличается от того, как номер хранится.
Взгляните на DecimalFormat для контроля того, как вы можете отображать свои числа при двойном (или с плавающей точкой и т.д.).
Обратите внимание, что выбор BigDecimal вместо double (или наоборот) имеет свои плюсы и минусы и будет зависеть от ваших требований. Смотрите здесь для получения дополнительной информации. Из резюме:
Таким образом, если сырые производительность и пространство являются наиболее важными факторами, примитивные типы с плавающей точкой являются подходящими. Если необходимо точно представить десятичные значения, требуются высокоточные вычисления или требуется точное управление округлением, только BigDecimal обладает необходимыми возможностями.
Двойного будет достаточно, чтобы сохранить это число. Если ваша проблема в том, что вам не нравится формат при печати или помещении его в строку, вы можете использовать NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html
Вы можете использовать double и отображать, если с System.out.printf ().
double d = 100003.81;
System.out.printf("%.10f", d);
.10f - означает двойной с точностью до 10