Viselkedésváltozás a kerekítésben a NumberFormat és DecimalFormat formázó metódusokban

A Java 8 bevezet egy viselkedésváltozást a tizedes számoknak a java.text.NumberFormat és a java.text.DecimalFormat osztályok format metódusa használatával végzett kerekítési viselkedésében, amikor az érték nagyon közel van egy határhoz, és pontosan a formázási mintában megadott kerekítési pozícióban van. A változás az olyan számokra van hatással, amelyek bináris numerikus ábrázolása nem pontos.

Például a 0.015 számítógép által elérhető legközelebbi bináris közelítése 0.01499999999999999944488848768742172978818416595458984375. Ha ezt a számot két számjegyre kerekíti, a Java 8-ban a válasz .01, mert .004999999 ... Kevesebb mint .005. A Java korábbi változataiban a válasz 0.02.

Ez a szabály megjelöli a NumberFormat és DecimalFormat format metódusokat, amikor ezek egy double primitívvel vagy egy java.lang.Double objektum első paramétereként vannak meghívva. A következő példa a format metódusok használatát mutatja be.

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 + "\" értéket ad vissza. Várt érték: \"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%\".");

}

Ha ezt a kódot Java 7 használatával hívja meg, akkor a következő kimenet jelenik meg:

format(0.8055) a "0.806" értéket adja vissza. A várt érték "0.805".
A formátum (0.015) a "0.02" értéket adja vissza. "0.01" elvárt.
A formátum (0.5555) az "55.6%" értéket adja vissza. Várt "55.5%".

Java 8 használata esetén a következő kimenet jelenik meg:

formátum (0.8055) a "0.805" értéket adja vissza. A várt érték "0.805".
A formátum (0.015) a "0.01" értéket adja vissza. "0.01" elvárt.
A formátum (0.5555) a "55.5%" értéket adja vissza. Várt "55.5%".

Legyen tudatában ennek a viselkedésváltozásnak, mert hatással lehet a program kimenetére. A JDK-7131459 hibajelentés további információkat ad, és bemutat több kapcsolódó jelentést, beleértve a Java 8 hibajelentéseket, amelyeknek ez a jelentés a regressziója.

Az érintett osztályokkal kapcsolatos további információkat a következő helyeken talál: