Perché è complicato
L’oggetto Math di JavaScript fornisce un metodo per arrotondare ai numeri interi. Se vogliamo arrotondare ad un certo numero di cifre decimali, allora dobbiamo gestirlo noi stessi. Questo post non entra nei dettagli dell’aritmetica in virgola mobile, ma per farla breve la maggior parte dei linguaggi di programmazione usa una rappresentazione binaria in virgola mobile che può solo approssimare molte frazioni decimali. Questo si traduce in errori di arrotondamento per gli approcci più comuni all’arrotondamento in JavaScript.
Errori di arrotondamento
Le soluzioni più comuni per l’arrotondamento ad una posizione decimale è di usare Number.prototype.toFixed()
, o moltiplicare il float per qualche potenza di 10 in modo da sfruttare Math.round()
. Entrambi funzionano, tranne che a volte un decimale di 5 viene arrotondato per difetto invece che per eccesso.
Number((1.005).toFixed(2)); // 1 instead of 1.01
Math.round(1.005*100)/100; // 1 instead of 1.01
Una soluzione migliore
Il problema dell’arrotondamento può essere evitato usando numeri rappresentati in notazione esponenziale:
Number(Math.round(1.005+'e2')+'e-2'); // 1.01
E per astrarlo in qualcosa di più utilizzabile:
function round(value, decimals) { return Number(Math.round(value+'e'+decimals)+'e-'+decimals);}round(1.005, 2); // 1.01