тип данных для представления большого десятичного числа в Java
-
05-07-2019 - |
Вопрос
Какой тип данных может представлять десятичное число, например " 10364055.81 ".
Если попытаться использовать double:
double d = 10364055.81;
Но когда я пытаюсь напечатать число, оно отображается как " 1.036405581E7 " ;, что мне не нужно.
Должен ли я использовать BigDecimal? Но он отображается как 10364055.81000000052154064178466796875 . Есть ли какой-либо тип данных, который отображает значения как есть? Также число может быть больше, чем в качестве примера.
Кстати, будет ли использование BigDecimal влиять на производительность приложения? Я мог бы использовать это почти во всех моих DTO.
Решение
Вы должны использовать BigDecimal, но использовать конструктор String , например:
new BigDecimal("10364055.81");
Если вы передаете double
в BigDecimal, Java должна сначала создать этот double - и так как double не может точно представить большинство десятичных дробей, он действительно создает значение как 10364055.81000000052154064178466796875
и then передает его конструктору BigDecimal. В этом случае BigDecimal не может знать, что вы на самом деле имели в виду версию более широкого круга.
Вообще говоря, использование нестроковых конструкторов BigDecimal следует рассматривать как предупреждение о том, что вы не получаете полного преимущества от класса.
Изменить . Исходя из того, что я перечитал именно то, что вы хотели, моя первоначальная претензия, вероятно, слишком сильна. BigDecimal - хороший выбор, когда вам нужно точно представить десятичные значения (обработка денег - очевидный выбор, вы не хотите, чтобы 5,99 * миллион был, например, 5990016,45
.
Но если вы не беспокоитесь о том, что число внутренне хранится как значение, немного отличающееся от введенного вами десятичного литерала, и просто хотите снова распечатать его в том же формате, то как говорили другие, экземпляр NumberFormat
(в этом случае new DecimalFormat (" ########. ## ")
) будет хитрость в том, чтобы красиво вывести двойное число, или String.format может делать то же самое.
Что касается производительности - BigDecimals, естественно, будет работать медленнее, чем примитивы. Однако, как правило, если в подавляющем большинстве вашей программы нет математических манипуляций, вы вряд ли заметите разницу в скорости. Это не значит, что вы должны использовать BigDecimals повсюду; скорее, если вы можете получить реальную выгоду от их функций, которые было бы трудно или невозможно реализовать с помощью простых double
, то не пренебрегайте крошечной разницей в производительности, которую они теоретически вводят.
Другие советы
Способ отображения числа отличается от того, как он хранится. Р>
Посмотрите на 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