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".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".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: