Это два отдельных вопроса: "Что мне использовать для 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(): он умеет кэшировать общие значения (как видно на < a href="http://download.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29" rel="noreferrer">Integer.valueOf()) и может даже изменить поведение кэширования без изменения вызывающего объекта. new будет всегда создавать новое значение, даже если в этом нет необходимости (лучший пример: new Boolean(true) против Boolean.valueOf(true)).
person
Joachim Sauer
schedule
25.08.2011