Cum se rotunjește un număr la N locuri zecimale în Java

1. Prezentare generală

În acest scurt articol, vom analiza cum se rotunjește un număr la n zecimale în Java.

2. Numere zecimale în Java

Java oferă două tipuri primitive care pot fi utilizate pentru stocarea numerelor zecimale: float și double . Dublu este tipul utilizat în mod implicit:

double PI = 3.1415;

Cu toate acestea, ambele tipuri nu trebuie utilizate niciodată pentru valori precise , cum ar fi monedele. Pentru aceasta și, de asemenea, pentru rotunjire, putem folosi clasa BigDecimal .

3. Formatarea unui număr zecimal

Dacă dorim doar să imprimăm un număr zecimal cu n cifre după punctul zecimal, putem pur și simplu să formatăm șirul de ieșire:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

Alternativ, putem formata valoarea cu clasa DecimalFormat :

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

DecimalFormat ne permite să setăm în mod explicit comportamentul de rotunjire, oferind mai mult control asupra ieșirii decât String.format () folosit mai sus.

4. Rotunjirea dublei cu BigDecimal

Pentru a rotunji dublu s la n zecimale, putem scrie o metodă de ajutor :

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

Există un lucru important de observat în această soluție - atunci când construiți BigDecimal ; noi trebuie să utilizeze întotdeauna BigDecimal (String) constructor . Aceasta previne problemele legate de reprezentarea valorilor inexacte.

Putem realiza același lucru folosind biblioteca Apache Commons Math:

 org.apache.commons commons-math3 3.5 

Cea mai recentă versiune poate fi găsită aici.

Odată ce biblioteca este adăugată la proiect, putem folosi metoda Precision.round () , care ia două argumente - valoare și scară:

Precision.round(PI, 3);

În mod implicit, folosește aceeași metodă de rotunjire HALF_UP ca metoda noastră de ajutor. Prin urmare, rezultatele ar trebui să fie aceleași.

Rețineți că putem schimba comportamentul de rotunjire prin trecerea metodei de rotunjire dorită ca al treilea parametru.

5. Rotunjirea dublurilor cu DoubleRounder

DoubleRounder este un utilitar din biblioteca decimal4j. Oferă o metodă rapidă și fără gunoi pentru rotunjirea dublurilor de la 0 la 18 zecimale.

Putem obține biblioteca (cea mai recentă versiune poate fi găsită aici) adăugând dependența la pom.xml :

 org.decimal4j decimal4j 1.0.3 

Acum, putem folosi pur și simplu:

DoubleRounder.round(PI, 3);

Cu toate acestea, DoubleRounder eșuează în câteva scenarii, de exemplu:

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Metoda Math.round ()

O altă modalitate de rotunjire a numerelor este utilizarea metodei Math.Round ().

În acest caz, putem controla n număr de zecimale înmulțind și împărțind cu 10 ^ n :

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

Această metodă nu este recomandată deoarece trunchiază valoarea . În multe cazuri, valorile sunt rotunjite incorect:

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

Astfel, această metodă este listată aici doar în scopuri de învățare.

7. Concluzie

În acest tutorial rapid, am acoperit diferite tehnici pentru rotunjirea numerelor la n zecimale.

Putem pur și simplu formata ieșirea fără a modifica valoarea sau putem rotunji variabila utilizând o metodă de ajutor. De asemenea, am acoperit câteva biblioteci care se ocupă de această problemă.

Codul utilizat în timpul discuției poate fi găsit pe GitHub.