Подтвердить что ты не робот

Почему HALF_UP иногда округляется вдвое?

Следующий код:

double doubleValue = 1713.6;
float floatValue = 1713.6f;
String fs = "%-9s : %-7s %-7s\n";
System.out.printf( fs, "", "double", "float" );

DecimalFormat format = new DecimalFormat("#0");
System.out.printf( fs, "toString", String.valueOf( doubleValue ), String.valueOf( floatValue ) );

format.setRoundingMode( RoundingMode.DOWN );
System.out.printf( fs, "DOWN", format.format( doubleValue ), format.format( floatValue ) );

format.setRoundingMode( RoundingMode.HALF_DOWN );
System.out.printf( fs, "HALF_DOWN", format.format( doubleValue ), format.format( floatValue ) );

format.setRoundingMode( RoundingMode.HALF_UP );
System.out.printf( fs, "HALF_UP", format.format( doubleValue ), format.format( floatValue ) );

format.setRoundingMode( RoundingMode.UP );
System.out.printf( fs, "UP", format.format( doubleValue ), format.format( floatValue ) );

Производит результат (код в реальном времени):

          : double  float  
toString  : 1713.6  1713.6 
DOWN      : 1713    1713   
HALF_DOWN : 1714    1714   
HALF_UP   : 1713    1714   <--- notice this line
UP        : 1714    1714   

Я знаю, что определенные числа не могут быть представлены точно как числа с плавающей запятой. Фактическое представление с плавающей запятой для 1713.6 составляет 1713.5999755859375 (см. эта страница).

Но почему HALF_UP округляется в этом случае?

Использование Java 1.8u25

4b9b3361

Ответ 2

Ideone использует sun-jdk-8u25, где появляется это багги.

В Java 1.7 я получаю HALF_UP: 1714 1714, который является правильным.

enum RoundingMode - определяет поведение округления для числовых операций, способных отбрасывать точность.

См. Oracle javadoc: результат округления ввода одной цифры с заданным режимом округления [Таблица округления]