Quando si lavora con i numeri all’interno di un programma può capitare di dover gestire gli arrotondamenti. In questo post vedremo come arrotondare numeri decimali all’interno di un programma Java.
Indice
Cosa significa “arrotondare” un numero?
L’arrotondamento è un processo matematico finalizzato alla riduzione delle cifre significative che esprimono una quantità. All’interno di un numero decimale la cifra meno significativa e quella più a destra dopo la virgola. facciamo un esempio, supponiamo di dover arrotondare questo numero:
12,5249
Supponiamo di dover ottenere un numero con un massimo di due decimali. Per raggiungere il risultato potremmo, semplicemente, eliminare le due cifre meno significative, cioè quelle più a destra (49).
Attraverso l’arrotondamento, quindi, andremo a ridurre il numero di cifre che esprimono la quantità cercando di eliminare quelle meno significative, che in un numero decimale sono quelle “più a destra” dopo la virgola.
In matematica esistono due tipo di arrotondamento:
- arrotondamento per difetto: anche detto troncamento, ci si limita a rimuovere le cifre decimali in eccesso rispetto a quelle desiderate, partendo ovviamente da destra (volendo ridurre a due il numero di decimali, nel nostro esempio otteniamo 12,52);
- arrotondamento per eccesso: si eliminano le cifre decimali in eccesso rispetto a quelle desiderate e posi si aggiunge 1 alla cifra più a destra del numero risultante dal troncamento (nel nostro esempio otteniamo 12,53);
- arrotonamento “puro”: il numero viene arrotondato per accesso o per difetto a seconda che il valore troncato si avvicini di più ad uno piuttosto che all’altro risultato (nel nostro esempio 12,52 in quanto la parte eliminata, cioè 0,0049, è più vicina a 0 che a 0,001).
Nell’arrotondamento “puro” si ha un problema quando la parte eliminata si trova esattamente ad essere equidistante (a esempio: 0,005); in questo caso, ovviamente, la scelta tra arrotondamento per difetto o per eccesso non può che essere arbitraria.
La classe Java.Math()
Per svolgere operazioni sui numeri è necessario importare nel nosro progetto java la classe Java.Math()
la quale fornisce una serie di metodi per arrotondare i numeri con virgola mobile all’intero più vicino. I metodi in questione sono:
- Math.round()
- Math.floor()
- Math.ceil()
I nomi di questi metodi sono autoesplicativi ma un esempio sarà utile per capire meglio come funziona:
class Test {
public static void main (String [] args) {
float num = 12.5249;
System.out.println (Math.round (num));
System.out.println (Math.floor (num));
System.out.println (Math.ceil (num));
}
}
Ora proviamo ad eseguire questo codice e ad osservarne il risultato nella console:
13 12.0 13.0
Math.round()
Questo metodo arrotonda un numero all’intero più vicino. Nell’esempio abbiamo 12,5249 ed il metodo restituisce 13, perché 13 è il numero intero più vicino. Se avessimo arrotondato 12,4249 con questo metodo avremmo ottenuto 12 perché 12 è il numero intero più vicino a 12,4249.
E’ importante ricordare che questo metodo restituisce un valore di tipo int (ovvero un numero intero) per questo motivo il metodo restituisce 13 invece di 13.0!
Math.floor()
Questo metodo arrotonda un numero per difetto all’intero più vicino. Il numero di partenza è 12,5249 e il numero più vicino verso il basso è 12. Se arrotondassimo il numero 12,9999 con l’aiuto di questo metodo otterremmo sempre 12, perché 12 è il numero più vicino verso il basso.
Il metodo Math.floor() restituisce un valore di tipo double per questo motivo il risultato sarà 12.0 e non 12.
Math.ceil()
Questo metodo arrotonda un numero per eccesso al numero intero più vicino. Il numero di partenza è 12,5249 e il numero più vicino verso l’alto è 13. Anche se avessimo avuto come numero di partenza 12,0001 il risultato sarebbe stato comunque 13, perché è sempre e comunque il numero più vicino.
Esattamente come il metodo Math.floor()
, anche Math.ceil()
restituisce un valore di tipo double.
Arrotondamento con decimali
Nell’esempio precedente abbiamo visto come arrotondare all’intero. Ma a volte potrebbe presentarsi l’esigenza di arrotondare mantenendo ugualmente un certo numero di decimali. Si pensi, ad esempio, agli arrotondamenti degli importi in Euro. In questo caso si potrebbe voler arrotondare un prezzo mantenendo comunque 2 cifre decimali.
Per raggiungere questo risultato ci sono più strade, una di queste prevede l’utilizzo di Math.round()
, che come abbiamo già visto consete di effettuare arrotondamenti all’intero. Vediamo subito il codice:
class Test {
public static void main (String [] args) {
double num = 12.5249;
double dueDecimali = Math.round(num*100.0)/100.0;
System.out.println (dueDecimali);
}
}
Il risultato sarà:
12.52
In pratica si usa un “trucchetto”: il numero, prima di essere arrotondato, viene moltiplicato per cento e, dopo l’arrotondamento, diviso nuovamente per 100… ottenendo coì un numero con due decimali.
Se avessimo voluto avere un numero con tre decimali avremmo usato 1.000 al posto di 100; con quattro decimali 10.000 al posto di 100 e così via.
Differenza tra float e double
Una nota conclusiva: negli esempi di questo articolo ho utilizzato sia il dataType float che double… entrambi rappresentano un numero a virgola mobile (“floating point”)… ma che differenza c’è tra questi due tipi di dato?
La differenza tra i due DataType è legata al livelo di precisione: attraverso float, infatti, è possibile esprimere numeri con un massimo di 6 cifre decimali mentre con double possiamo indicarne fino a 15!