Změna chování při zaokrouhlování v metodách formátování NumberFormat a DecimalFormat

Java 8 zavádí změnu chování v chování zaokrouhlování desetinných čísel pomocí metody format na java.text.NumberFormat a také java.text.DecimalFormat třídy, když je hodnota velmi blízko k remíze, sedí přesně na pozici zaokrouhlení uvedené ve formátovacím vzoru. Změna ovlivňuje čísla s binárním číselným znázorněním, které není přesné.

Například nejbližší binární aproximace čísla 0.015, kterou počítač může dosáhnout, je 0.01499999999999999944488848768742172978818416595458984375. Když se číslo zaokrouhluje na dvě číslice v prostředí Java 8, bude výsledek .01, protože .004999999 .... je menší než .005. V předchozích verzích Java by byl výsledek 0.02.

Toto pravidlo označí volání metod NumberFormat a DecimalFormat format v případě, že jsou volány s primitivem double nebo java.lang.Double jako prvním parametrem. Následující příklad zobrazuje použití metod 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("formát (" + aDouble + ") vrací \" "+ myStr +" \". Očekává se \"0.805\".");

nf.setMaximumFractionDigits(2);
aDouble = 0.015d;
myStr = nf.format(aDouble);
System.out.println("formát (" + aDouble + ") vrací \" "+ myStr +" \". Očekává se \"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) vrací \"" + myStr + " \". Očekává se \"55.5% \". ");

}

Voláte-li tento kód pomocí Java 7, zobrazí se následující výstup:

formát(0,8055) vrátí hodnotu „0,806“. Očekává se „0,805“.
formát(0,015) vrátí hodnotu „0,02“. Očekává se „0,01“.
formát(0,5555) vrátí „55,6%“. Očekává se „55,5%“.

V Java 8 se zobrazí následující výstup:

formát(0,8055) vrátí „0,805“. Očekává se „0,805“.
formát (0,015) vrátí hodnotu „0,01“. Očekává se „0,01“.
formát(0,5555) vrátí „55,5%“. Očekává se „55,5%“.

Uvědomte si toto chování, protože to může ovlivnit výstup programu. V hlášení o chybě JDK-7131459 naleznete další informace a také další související hlášení, včetně hlášení chyb Java 8, které toto uvádí jako regresi.

Další informace o ovlivněných třídách viz následující zdroje: