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

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".
format(0.015) returns "0.02". Expecting "0.01".
format(0.5555) returns "55.6%". Expecting "55.5%".

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

format(0.8055) returns "0.805". Expecting "0.805".
format(0.015) returns "0.01". Expecting "0.01".
format(0.5555) returns "55.5%". Expecting "55.5%".

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