Come arrotondare un numero a N cifre decimali in Java

1. Panoramica

In questo breve articolo, vedremo come arrotondare un numero a n cifre decimali in Java.

2. Numeri decimali in Java

Java fornisce due tipi primitivi che possono essere utilizzati per memorizzare i numeri decimali: float e double . Double è il tipo utilizzato per impostazione predefinita:

double PI = 3.1415;

Tuttavia, entrambi i tipi non dovrebbero mai essere utilizzati per valori precisi , come le valute. Per questo, e anche per l'arrotondamento, possiamo usare la classe BigDecimal .

3. Formattazione di un numero decimale

Se vogliamo solo stampare un numero decimale con n cifre dopo il punto decimale, possiamo semplicemente formattare la stringa di output:

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

In alternativa, possiamo formattare il valore con la classe DecimalFormat :

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

DecimalFormat ci consente di impostare esplicitamente il comportamento dell'arrotondamento, dando più controllo sull'output rispetto a String.format () usato sopra.

4. Arrotondare i doppi con BigDecimal

Per rotonde doppie s a n cifre decimali, siamo in grado di scrivere un metodo di supporto :

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(); }

C'è una cosa importante da notare in questa soluzione: quando si costruisce BigDecimal ; dobbiamo sempre usare BigDecimal (String) costruttore . Ciò evita problemi con la rappresentazione di valori inesatti.

Possiamo ottenere lo stesso risultato utilizzando la libreria Apache Commons Math:

 org.apache.commons commons-math3 3.5 

L'ultima versione può essere trovata qui.

Una volta aggiunta la libreria al progetto, possiamo utilizzare il metodo Precision.round () , che accetta due argomenti: valore e scala:

Precision.round(PI, 3);

Per impostazione predefinita, utilizza lo stesso metodo di arrotondamento HALF_UP del nostro metodo di supporto. Pertanto, i risultati dovrebbero essere gli stessi.

Nota che possiamo cambiare il comportamento di arrotondamento passando il metodo di arrotondamento desiderato come terzo parametro.

5. Arrotondare i doppi con DoubleRounder

DoubleRounder è un'utilità nella libreria decimal4j. Fornisce un metodo veloce e senza errori per arrotondare i doppi da 0 a 18 punti decimali.

Possiamo ottenere la libreria (l'ultima versione può essere trovata qui) aggiungendo la dipendenza al pom.xml :

 org.decimal4j decimal4j 1.0.3 

Ora possiamo semplicemente usare:

DoubleRounder.round(PI, 3);

Tuttavia, DoubleRounder non riesce in alcuni scenari, ad esempio:

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

6. Metodo Math.round ()

Un altro modo per arrotondare i numeri è usare il metodo Math.Round ().

In questo caso, possiamo controllare n numero di cifre decimali moltiplicando e dividendo per 10 ^ n :

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

Questo metodo non è consigliato poiché tronca il valore . In molti casi i valori vengono arrotondati in modo errato:

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

E così, questo metodo è elencato qui solo per scopi di apprendimento.

7. Conclusione

In questo breve tutorial, abbiamo coperto diverse tecniche per arrotondare i numeri alle n cifre decimali.

Possiamo semplicemente formattare l'output senza modificare il valore, oppure possiamo arrotondare la variabile utilizzando un metodo di supporto. Abbiamo anche trattato alcune librerie che si occupano di questo problema.

Il codice utilizzato durante la discussione può essere trovato su GitHub.