为什么HALF_UP有时会以双倍的形式向下舍入?

Gre*_*ant 10 java rounding

以下代码:

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 ) );
Run Code Online (Sandbox Code Playgroud)

生成结果(实时代码):

          : double  float  
toString  : 1713.6  1713.6 
DOWN      : 1713    1713   
HALF_DOWN : 1714    1714   
HALF_UP   : 1713    1714   <--- notice this line
UP        : 1714    1714   
Run Code Online (Sandbox Code Playgroud)

我知道某些数字不能完全表示为浮点数.1713.6的实际浮点表示形式为1713.5999755859375(参见本页).

但是为什么HALF_UP 在这种情况下向下舍入?

使用Java 1.8u25

msz*_*ach 14

Java 8中有关于NumberFormat和RoundingMod HALF_UP的错误,请参阅8039915.这是用8u40(发行说明)修复的.