在使用 java.text.NumberFormat 和
java.text.DecimalFormat 類別的 format 方法進行小數的四捨五入行為中,當值非常接近對半時,亦即剛好落在格式化型樣中指定的四捨五入位置,Java 8 引進行為變更。 此變更會影響二進位數值表示法不準確的數字。
例如,以 0.015 來說,電腦可達到的最接近的二進位近似值是 0.01499999999999999944488848768742172978818416595458984375。 如果您將此數字四捨五入為二位數,則在 Java 8 中,答案是 .01,因為 .004999999.... 小於 .005。 在舊版 Java 中,答案為 0.02。
此規則會標示以 double 基本類型或 java.lang.Double 物件作為第一個參數呼叫的 NumberFormat 和 DecimalFormat 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 + ") returns \"" + myStr + "\". Expecting \"0.805\"."); nf.setMaximumFractionDigits(2); aDouble = 0.015d; myStr = nf.format(aDouble); System.out.println("format(" + aDouble + ") returns \"" + myStr + "\". Expecting \"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 + "\". Expecting \"55.5%\"."); } |
如果您使用 Java 7 呼叫這段程式碼,將會顯示下列輸出:
format(0.8055) returns "0.806". 需要 "0.805"。在 Java 8 中會顯示下列輸出:
format(0.8055) 傳回 "0.805"。 需要 "0.805"。請注意此行為變更,它可能影響您的程式輸出。 JDK-7131459 錯誤報告提供其他資訊並顯示一些相關報告,包括認為 Java 8 更不理想而提出的錯誤報告。
如需受影響類別的相關資訊,請參閱下列資源: