Результаты на моей машине:
7.739999999999999
7.740000
Это меня совсем не удивляет. Во втором случае мы имеем дело с BigDecimal и всегда умножаем - нет никаких причин, чтобы что-то пошло не так.
В первом случае вы конвертируете BigDecimal в double, поэтому ваш код эффективно
double d = 0.0774;
System.out.println(d * 100.0);
Значение 0.0774 не может быть точно представлено как double
, отсюда и расхождение.
Это не имеет ничего общего с BigDecimal
, и все, что связано с double
. Вы должны почти никогда не преобразовывать между BigDecimal
и double
, хотя - типы значений, которые подходят для использования в BigDecimal
, почти всегда неуместны для представления как double
значения.