NumberFormat 和 DecimalFormat 格式方法中四捨五入的行為變更

Java 8 在使用 format 方法的十進位數四捨五入行為中引進行為變更。 java.text.NumberFormat java.text.DecimalFormat 當值非常接近連結空間時,完全位於格式化型樣中指定的四捨五入位置。 此變更會影響二進位數值表示法不準確的數字。

例如,以 0.015 來說,電腦可達到的最接近的二進位近似值是 0.01499999999999999944488848768742172978818416595458984375。 如果您將此數字四捨五入為二位數,則在 Java 8 中,答案是 .01,因為 .004999999.... 小於 .005。 在舊版 Java 中,答案為 0.02。

此規則會標示以 double 基本類型或 java.lang.Double 物件作為第一個參數呼叫的 NumberFormatDecimalFormat format 方法。 下列範例顯示 format 方法的用法。

public static void main(String[] args) {

java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
nf.setMaximumFractionDigits(3);
double aDouble;
String myStr;

aDouble = 0.8055d;
myStr = nf.format(aDouble);
System.out.println("format (" + aDouble + ") 傳回 \" "+ myStr +" \"。 預期 \"0.805\".");

nf.setMaximumFractionDigits(2);
aDouble = 0.015d;
myStr = nf.format(aDouble);
System.out.println("format (" + aDouble + ") 傳回 \" "+ myStr +" \"。 預期 \"0.01\".");


NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMinimumFractionDigits(1);
percent.setMaximumFractionDigits(1);
percent.setRoundingMode(RoundingMode.HALF_EVEN);
myStr = percent.format(0.5555);
System.out.println("format (0.5555) returns \"" + myStr + " \". 預期 \"55.5% \". ");

}

如果您使用 Java 7 呼叫這段程式碼,將會顯示下列輸出:

format(0.8055) returns "0.806". 需要 "0.805"。
format(0.015) 傳回 "0.02"。 預期 "0.01"。
format(0.5555) 傳回 "55.6%"。 需要 "55.5%"。

在 Java 8 中會顯示下列輸出:

format(0.8055) 傳回 "0.805"。 需要 "0.805"。
format(0.015) 傳回 "0.01"。 預期 "0.01"。
format(0.5555) 傳回 "55.5%"。 需要 "55.5%"。

請注意此行為變更,它可能影響您的程式輸出。 JDK-7131459 錯誤報告提供其他資訊並顯示一些相關報告,包括認為 Java 8 更不理想而提出的錯誤報告。

如需受影響類別的相關資訊,請參閱下列資源: