Мы должны использовать дважды или BigDecimal для вычислений в Java?
Сколько издержки с точки зрения производительности для BigDecimal, как сравнено для удвоения?
Для серьезного финансового приложения BigDecimal просто необходим.
В зависимости от того, сколько цифр вам нужно, вы можете использовать длинные и десятичные коэффициенты для визуализации.
Даже в сфере финансов мы не можем ответить, не зная, в какой сфере. Например, если вы конвертируете миллиарды долларов в валюту, где курс конвертации может составлять 5 d.p. у вас могут быть проблемы с двойным. Тогда как для простого сложения и вычитания остатков все будет в порядке.
Если вам не нужно работать в долях цента / пенни, возможно, более подходящим будет целочисленный тип, опять же, это зависит от размера задействованных чисел.
Для общих вычислений с плавающей запятой следует использовать double
. Если вы абсолютно уверены, что вам действительно нужна арифметика произвольной точности (в большинстве приложений это не так), то вы можете рассмотреть BigDecimal
.
Вы обнаружите, что double
значительно превосходит BigDecimal
(не говоря уже о том, что с ним проще работать) для любого приложения, где double
является достаточной точностью.
Update: Вы прокомментировали в другом ответе, что хотите использовать это для приложения, связанного с финансами. Это одна из областей, где вам действительно следует рассмотреть использование BigDecimal
, иначе вы можете получить неожиданные эффекты округления от вычислений double
. Кроме того, значения double
имеют ограниченную точность, и вы не сможете точно отслеживать копейки одновременно с миллионами долларов.
Как всегда: зависит от обстоятельств.
Если вам нужна точность (даже для «маленьких» чисел, например, при представлении сумм), выберите BigDecimal
.
В некоторых научных приложениях double
может быть лучшим выбором.
Сколько накладных расходов с точки зрения производительности BigDecimal по сравнению с double?
Много. Например, умножение двух чисел двойной точности - это одна машинная инструкция. Умножение двух BigDecimals, вероятно, составляет минимум 50 машинных инструкций и имеет сложность O (N * M)
, где M
и N
- количество используемых байтов. для представления двух чисел.
Однако, если ваше приложение требует, чтобы вычисление было «десятичным правильным», вам необходимо принять накладные расходы.
Однако (# 2) ... даже BigDecimal
не может выполнить это вычисление с точностью действительного числа :
1/3 + 1/3 + 1/3 -> ?
Чтобы выполнить это вычисление точно, вам потребуется реализовать Рациональный
тип; то есть пара значений BigInteger
... и кое-что для уменьшения общих факторов.
Однако (# 3) ... даже гипотетический рациональный
тип не даст вам точного числового представления для (скажем) числа Пи.