Modificarea comportamentului la rotunjire în metodele de format NumberFormat şi DecimalFormat

Java 8 introduce o schimbare de comportament în comportamentul de rotunjire a numerelor zecimale folosind metoda format pe java.text.NumberFormat și java.text.DecimalFormat clase atunci când valoarea este foarte aproape de o cravată, stând exact la poziția de rotunjire specificate î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 +") returnează \" + myStr + " \". Asteptam \"0.805\".);

nf.setMaximumFractionDigits(2);
aDouble = 0.015d;
myStr = nf.format(aDouble);
System.out.println("format (+ aDouble +") returnează \" + myStr + " \". Asteptam \"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) revine \"" + myStr " \". Asteptam \"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".
format(0.015) returnează "0.02". Se aștepta "0.01".
format(0.5555) returnează "55.6%". Se aștepta "55.5%".

În Java 8, este afişat următorul rezultat:

format(0.8055) returnează "0.805". Se aștepta "0.805".
format(0.015) returnează "0.01". Se aștepta "0.01".
format(0.5555) returnează "55.5%". Se aștepta "55.5%".

Ţ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: