Вы должны использовать 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
, то не пренебрегайте крошечной разницей в производительности, которую они теоретически вводят.