Java 8 zavádí změnu chování v zaokrouhlování desetinných čísel pomocí metody format ve třídách java.text.NumberFormat a
java.text.DecimalFormat v případě, že se hodnota blíží rozhodné úrovni (tie), nacházející se přesně na pozici zaokrouhlení určené ve vzorci formátování. 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("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%\"."); } |
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“.V Java 8 se zobrazí následující výstup:
formát(0,8055) vrátí „0,805“. Očekává se „0,805“.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: