Это два отдельных вопроса: «Что я должен использовать для BigDecimal
?» и "Что мне вообще делать?"
Для BigDecimal
: это немного сложно, потому что они не делают то же самое . BigDecimal.valueOf(double)
будет использовать каноническое String
представление значения double
, переданного для создания экземпляра объекта BigDecimal
. Другими словами: значение объекта BigDecimal
будет тем, что вы увидите, когда будете делать System.out.println(d)
.
Если вы используете new BigDecimal(d)
, то BigDecimal
попытается представить double
значение с максимально возможной точностью . Это обычно приведет к тому, что будет сохранено гораздо больше цифр, чем вы хотите. Строго говоря, это более правильно, чем valueOf()
, но гораздо менее интуитивно понятно.
В JavaDoc есть хорошее объяснение этого:
Результаты этого конструктора могут быть несколько непредсказуемыми. Можно предположить, что запись new BigDecimal(0.1)
в Java создает BigDecimal
, который в точности равен 0,1 (немасштабированное значение 1 со шкалой 1), но фактически равен 0,1000000000000000055511151231257827021181583404541015625. Это потому, что 0.1 не может быть представлен точно как double
(или, в этом отношении, как двоичная дробь любой конечной длины). Таким образом, значение, которое передается в конструктор, не совсем равно 0,1, несмотря на внешний вид.
Как правило, , если результат тот же (т.е. не в случае BigDecimal
, а в большинстве других случаев), тогда предпочтительным является valueOf()
: он может выполнять обычное кэширование. значения (как видно на Integer.valueOf()
), и это может даже изменить поведение кэширования без необходимости изменения вызывающей стороны. new
будет всегда создавать новое значение, даже если в этом нет необходимости (лучший пример: new Boolean(true)
против Boolean.valueOf(true)
).