In questo articolo Javascript sarà proposta una function per eseguire arrotondamenti di valori numerici decimali con una quantità arbitraria di cifre decimali.
In verità, la classe javascript Math possiede già la funzione nativa round(x) per gli arrotondamenti ma, purtroppo, questa non consente di conservare alcun valore decimale poichè restituisce sempre un valore numerico intero arrotondato, per difetto o eccesso, al numero più vicino.
La soluzione che propongo nasce dalla mia esigenza, all'interno di un progetto JEE che seguo presso una banca, di dover eseguire calcoli dinamicamente su valori BigDecimal, restituiti da una java Struts action, all'interno di alcun pagine JSP e di fornire all'utente un valore formattato con 3 valori decimali.
La funzione roundTo(value, decimals)
/**
* Utile per gli arrotondamenti di valori decimali.
*
* @param value Il valore numerico da arrotondare.
* @param decimals Il numero di decimali da considerare.
* @return Il valore arrotondato con n decimali a scelta.
*/
function roundTo(value, decimals){
var i = value * Math.pow(10, decimals);
i = Math.round(i);
return i / Math.pow(10, decimals);
}
La funzione è tanto semplice quanto funzionale ed ingegnosa.
Sostanzialmente, dapprima sposta a destra la virgola del valore da arrotondare di n posizioni pari al valore dei decimali richiesti, successivamente esegue un arrotondamento standard e al valore ottenuto sposta ancora la virgola di n posizioni, ma questa volta verso sinistra.
Il valore ottenuto avrà quindi il numero di decimali richiesti di cui si necessita.
Seguendo la spiegazione di cui sopra, nell'esempio seguente il valore decimale 1234,5678 verrà moltiplicato per 1000 (risultato della potenza 10^3) divenendo 1234567,8; arrotondato al valore intero più vicino, cioè 1234568, e subito diviso per 1000: il risultato finale sarà un numero con 3 decimali dei quali l'ultimo arrotondato per eccesso, ovvero si otterrà il valore 1234,568.
var v = 1234.5678;
var d = 3;
alert('Valore in ingresso: ' + v + ';\n'
+ 'Numero di decimali richiesto: ' + d + ';\n'
+ 'Valore arrotondato restituito: ' + roundTo(v, d));
Non so il motivo per cui il metodo nativo Math.round(x) non abbia questa funzionalità demandandone l'implementazione agli sviluppatori, ma tant'è.
Alla prossima,
MA.