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) returns "0.806". Expecting "0.805".În Java 8, este afişat următorul rezultat:
format(0.8055) returns "0.805". Expecting "0.805".Ţineţi cont de această schimbare de comportament, deoarece v-ar putea afecta ieşirea de program. Raportul de defect JDK-7131459 furnizează mai multe informaţii şi prezintă câteva rapoarte, inclusiv rapoarte de defect pentru Java 8, care semnalează aceasta ca un regres.
Pentru informaţii suplimentare despre clasele afectate, consultaţi următoarele resurse: