back to top

Arrotondare un numero con Java

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.

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!

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Java: cos’è e a cosa serve l’operatore modulo (%)

In Java, l'operatore modulo è rappresentato dal simbolo "%"...

Java: cos’è l’errore NullPointerException e come risolverlo

RuntimeException รจ una superclasse di Java che ricomprende tutte...

Stringhe in Java

La gestione delle stringhe assume un ruolo fondamentale in...

Leggere un file di testo in java

In java ci sono diverse modalità per leggere dati...

Il costrutto foreach in java

Il foreach è un particolare costrutto (disponibile a partire...

Java split() – dividere una stringa

Grazie al metodo split() della classe String di Java...
Pubblicitร