Java 8 introduce o modificare de comportament în comportamentul de rotunjire a numerelor zecimale
folosind metoda format
pe clasele java.text.NumberFormat şi
java.text.DecimalFormat
când valoarea este foarte apropiată de egalitate, fiind exact la poziţia de rotunjire
specificată în modelul de formatare. Modificarea afectează numerele cu o reprezentare numerică
binară care nu este exactă.
De exemplu, cea mai apropiată aproximare binară de 0.015 pe care un computer o poate atinge este 0.01499999999999999944488848768742172978818416595458984375. Dacă rotunjiţi în jos acel număr la două cifre, în Java 8 răspunsul este 0,01 pentru că 0,004999999 .... este mai mic decât 0,005. În versiunile anterioare de Java, răspunsul este 0,02.
Această regulă semnalează apelurile către metodele NumberFormat şi
DecimalFormat format atunci când sunt apelate cu
o primitivă double sau cu un obiect java.lang.Double
ca prim parametru.
Următorul exemplu arată utilizarea metodelor 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%\"."); } |
Dacă apelaţi acest cod folosind Java 7, este afişat următorul rezultat:
format(0.8055) returnează "0.806". Se aștepta "0.805".În Java 8, este afişat următorul rezultat:
format(0.8055) returnează "0.805". Se aștepta "0.805".Ţineţi cont de această schimbare de comportament, deoarece v-ar putea afecta ieşirea de program. JDK-7131459 bug report furnizează mai multe informaţii şi arată un număr de rapoarte înrudite, inclusiv rapoarte de bug-uri din Java 8 care le raportează ca o regresie.
Pentru informaţii suplimentare despre clasele afectate, consultaţi următoarele resurse: