2016-11-21 3 views
1

Я пытаюсь округлить до 1-значного числа. Ниже приведен фрагмент кода.DecimalFormat Не дает результат по Half_Even Rounding

DecimalFormat decimalFormat = new DecimalFormat("#0.#"); 
String formattedNumber = decimalFormat.format(4.65d); 
System.out.println(formattedNumber); 

Выход
4,7

Согласно DecimalFormat Javadoc, его значение по умолчанию округление HALF_EVEN. По этому правилу 4.65 следует округлить до 4.6. Но, он дает выход как 4.7. Пожалуйста, помогите мне понять это поведение.

+0

@ChiragParmar это не дубликат. Другой вопрос заключается в понимании основ HALF_EVEN, это не цель этого вопроса. Скорее, мы обсуждаем причину непредвиденного поведения, показанного во время округления в указанном случае, на который в другом вопросе не указан ответ. – sky

ответ

3

Двойник имеет небольшую ошибку представления для многих десятичных значений, в том числе 4.65, которая на самом деле немного выше, чем кажется.

System.out.println(new BigDecimal(4.65)); 

печатает

4.6500000000000003552713678800500929355621337890625 
+0

Спасибо за ваш ответ. Можете ли вы предоставить некоторые материалы для чтения, чтобы больше узнать об этом представлении ошибок в некоторых десятичных значениях. Это специфично для Java? – sky

+1

@sky это та же проблема для всех стандартных реализаций IEEE 754. Google для ссылок на это. Половина даже не означает многого, если значение как точное представление. –

1

В дополнении к Lawrey Петра ответить, вы можете попробовать перейти к decimalFormat.format() методе BigDecimal(String val), чтобы обеспечить прохождение точного значения:

String formattedNumber = decimalFormat.format(new BigDecimal("4.65")); 
System.out.println(formattedNumber); 

вы получите выход 4.6.