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

A Java 8 bemutatja a decimális számok kerekítési viselkedését a formátum módszer használatával a en java.text.NumberFormat és a java.text.DecimalFormat Osztályok, amikor az érték nagyon közel van egy nyakkendőhöz, pontosan a formázási mintában megadott kerekítési pozícióban. 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("formátum (" + aDouble + ") A következőt adja vissza: \" "+ myStr +" \". A várt \"0.805\".

nf.setMaximumFractionDigits(2);
aDouble = 0.015d;
myStr = nf.format(aDouble);
System.out.println("formátum (" + aDouble + ") A következőt adja vissza: \" "+ myStr +" \". A várt \"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("formátum (0.5555) a \"" + myStr + " \" értéket adja vissza. \"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: