83 votes

Arrondi gaussien / banquier en Javascript

J'ai été en utilisant Math.Round(myNumber, MidpointRounding.ToEven) en c# pour faire de mon côté serveur arrondissement, cependant, l'utilisateur doit connaître son "live" de ce que le résultat du fonctionnement du côté serveur sera ce qui signifie (en évitant une requête ajax) la création d'une méthode javascript pour répliquer l' MidpointRounding.ToEven méthode utilisée par c#.

MidpointRounding.ToEven est Gaussien/Banquiers arrondi, une méthode d'arrondi pour les systèmes comptables décrites ici.

Quelqu'un a une expérience avec cela? J'ai trouvé des exemples en ligne, mais ils ne sont pas ronds à un donné le nombre de décimales...

116voto

Tim Down Points 124501
 function evenRound(num, decimalPlaces) {
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
                ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
}

console.log( evenRound(1.5) ); // 2
console.log( evenRound(2.5) ); // 2
console.log( evenRound(1.535, 2) ); // 1.54
console.log( evenRound(1.525, 2) ); // 1.52
 

Démo en direct: http://jsfiddle.net/NbvBp/

Pour ce qui ressemble à un traitement plus rigoureux de cela (je ne l'ai jamais utilisé), vous pouvez essayer cette implémentation BigNumber .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X