Глядя на исходный код для BigDecimal, он делает:
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}
Из своего JavaDoc:
Преобразует двойное в BigDecimal, используя предоставленное представление канонической строки двойногометодом Double.toString (double).
Примечание. Как правило, это предпочтительный способ преобразования double (или числа с плавающей запятой) в BigDecimal, поскольку возвращаемое значение равно значению, полученному в результате создания BigDecimal из результата использования Double.toString (double).
Из-за представления с плавающей запятой двойное значение не совсем то, что вы задали.Однако во время представления String он округляет то, что отображает.(Все правила указаны на JavaDoc ).
Более того, из-за этого округления вы сделали:
BigDecimal d = BigDecimal.valueOf(4.00000000000000000000000000000000001));
васполучит неправильное значение.(d == 4.0)
Итак, всегда лучше инициализировать их строками.