Share |

sabato 18 dicembre 2010

Javascript: Arrotondamento di numeri decimali

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.

giovedì 2 dicembre 2010

Intervista concessa ai ragazzi di Who-Hub

Qualche giorno fa ho ricevuto un tweet di contatto dai ragazzi di Who-Hub che mi richiedevano un'intervista.

Ovviamente l'intervista si è svolta ed è possibile per chiunque leggerla a questo indirizzo.

Il contenuto dell'intervista verte sul mio background tecnico-informatico, su comportamenti ed abitudini adottate in fase di sviluppo del software, gli strumenti che utilizzo solitamente ed altre cose meno importanti e più sfiziose.

Detto questo, chiunque abbia voglia di contattarmi, per qualunque motivo e attraverso la piattaforma di micro-blogging Twitter, il mio username è @magirtiko.

Alla prossima,
MA.