Pourquoi c’est compliqué
L’objet Math de JavaScript fournit une méthode pour arrondir aux nombres entiers. Si nous voulons arrondir à un nombre défini de décimales, alors nous devons gérer cela nous-mêmes. Ce billet ne rentre pas dans les détails de l’arithmétique à virgule flottante, mais en résumé, la plupart des langages de programmation utilisent une représentation binaire à virgule flottante qui ne peut qu’approcher de nombreuses fractions décimales. Cela entraîne des erreurs d’arrondi pour les approches les plus courantes de l’arrondi en JavaScript.
Erreurs d’arrondi
Les solutions les plus courantes pour arrondir à une décimale sont soit d’utiliser Number.prototype.toFixed()
, soit de multiplier le flottant par une certaine puissance de 10 afin de tirer parti de Math.round()
. Ces deux méthodes fonctionnent, sauf que parfois une décimale de 5 est arrondie vers le bas au lieu d’être arrondie vers le haut.
Number((1.005).toFixed(2)); // 1 instead of 1.01
Math.round(1.005*100)/100; // 1 instead of 1.01
Une meilleure solution
Le problème d’arrondi peut être évité en utilisant des nombres représentés en notation exponentielle :
Number(Math.round(1.005+'e2')+'e-2'); // 1.01
Et pour abstraire cela en quelque chose de plus utilisable :
function round(value, decimals) { return Number(Math.round(value+'e'+decimals)+'e-'+decimals);}round(1.005, 2); // 1.01
.