Странное поведение при округлении с BigDecimal? - PullRequest
0 голосов
/ 21 сентября 2011

Что будет напечатано на консоли и почему?

1

BigDecimal BigDecimalNum = new BigDecimal("0.0774");
System.out.println(BigDecimalNum.doubleValue() * 100.00);

2

BigDecimal BigDecimalNum2 = new BigDecimal("0.0774");   
System.out.println(BigDecimalNum2.multiply(new BigDecimal("100.00")));

1 Ответ

5 голосов
/ 21 сентября 2011

Результаты на моей машине:

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 значения.

...