J’ai décidé de créer un nouveau sujet car le problème le plus récent ne concerne pas des règles d’arrondi douteuses, mais des règles complètement fausses. Le sujet doit donc être placé dans la catégorie Contribute > Bug. Ce n’est pas un problème majeur, mais c’est tout de même quelque peu gênant.
Nous avions organisé un sondage public où 106 votes avaient été exprimés. Il y avait 69 votes pour “non” et 37 pour “oui”. Un simple calcul donne que 69/106 représente environ 65,09 %. Pourtant, le système indique que 66 % ont voté “non” et 34 % “oui”. Voici une capture d’écran :
Le résultat final était de 72 votes pour “non” et 38 pour “oui”, et le sondage est maintenant clos. 72/110 représente environ 65,45 %, que le système arrondit également à 66 %, vous pouvez donc voir le bug en action sur Tappara.co.
J’ai essayé d’examiner le code pour trouver la cause du bug, mais sans succès. J’ai découvert qu’une fonction nommée evenRound est appelée, mais lorsque j’ai cherché sa source, je ne l’ai pas trouvée. C’est juste une hypothèse, mais peut-être que cette fonction arrondit le nombre à l’entier pair le plus proche ?
Le résultat est catastrophique, c’est ça qui ne fonctionne pas.
Merci pour le code. Je ne l’avais pas trouvé, ce qui montre à quel point je suis nul sur GitHub. Le code est extrait de Stack Overflow, où son auteur écrit :
Je ne sais pas quel niveau de précision vous recherchez, mais ce que je ferais serait simplement d’ajouter 1 aux n premiers nombres, n étant l’arrondi supérieur de la somme totale des décimales. Dans ce cas, c’est 3, donc j’ajouterais 1 aux trois premiers éléments et j’arrondirais à l’inférieur les autres. Bien sûr, ce n’est pas super précis, certains nombres pourraient être arrondis à la hausse ou à la baisse alors qu’ils ne le devraient pas, mais ça fonctionne assez bien et le résultat sera toujours de 100 %.
Il n’est pas surprenant qu’avec une méthode aussi brutale, on obtienne des résultats étranges. Je suggérerais d’être un peu plus élaboré. Ce message dans le même sujet a 72 votes positifs, tandis que le message d’où provient le code n’en a qu’un.
Il existe de nombreuses façons de faire cela, à condition que vous ne soyez pas préoccupé par la dépendance aux données décimales originales.
La première méthode, et peut-être la plus populaire, serait la Méthode du Plus Grand Reste
Qui est essentiellement :
Arrondir tout à l’inférieur
Calculer la différence entre la somme et 100
Répartir cette différence en ajoutant 1 aux éléments dans l’ordre décroissant de leurs parties décimales
…
Je pense que cette méthode serait le meilleur choix. Elle reste très simple et donne des résultats bien meilleurs. Le code actuel a besoin de quelques lignes supplémentaires pour indiquer à la fonction quels nombres doivent être arrondis à la hausse. Il y a cependant un autre point à considérer. D’après ce message dans le même sujet :
La réponse très appréciée de Varun Vohra minimise la somme des erreurs absolues, et elle est très simple à implémenter. Cependant, il existe des cas limites qu’elle ne gère pas : quel devrait être le résultat de l’arrondi de 24,25, 23,25, 27,25, 25,25 ? L’un d’eux doit être arrondi à la hausse au lieu d’être arrondi à la baisse.
Le message suggère diverses méthodes pour choisir lequel est arrondi à la hausse et lequel à la baisse, mais vous ne pouvez jamais complètement éviter les choix arbitraires. Si vous voulez viser la perfection, vous pourriez lire la suite de ce message, mais je serais satisfait de cette approche même dans ces cas spéciaux rares.
Vous choisiriez probablement arbitrairement le premier ou le dernier de la liste.
J’espère que cela vous aide. Mes compétences seraient probablement suffisantes pour apporter les améliorations moi-même si j’étudiais d’abord la syntaxe de base. Je ne vais pas le faire tout de suite, mais peut-être à un moment donné si quelqu’un ne s’y penche pas avant.
Édition. J’ai amélioré le titre en changeant le mot « cassé » par « imprécis ». Ce sujet devrait également être déplacé vers Contribute > Feature ou fusionné avec le sujet précédent.
It was like classic exercises for beginning programmers. Here is a way to do it, but someone who has more experience and isn’t totally new to JavaScript might find some shortcuts.