тип данных для представления большого десятичного числа в Java

StackOverflow https://stackoverflow.com/questions/1605910

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top