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 le, akkor a Java 8 változatban a válasz .01 mert a .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:

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

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

A format(0.8055) a "0.805" értéket adja vissza. A várt érték "0.805".
A format(0.015) a "0.01" értéket adja vissza. A várt érték "0.01".
A format(0.5555) a "55.5%" értéket adja vissza. A várt érték "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 nyújt és több kapcsolódó jelentést is bemutat, például Java 8 hibajelentéseket, amelyek ezt visszalépésnek jelentik.

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