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