Ich habe beschlossen, ein neues Thema zu erstellen, da das neueste Problem nicht fragwürdige Rundungsregeln betrifft, sondern völlig falsche Regeln. Daher muss das Thema in die Kategorie Contribute > Bug. Kein großes Problem, aber trotzdem etwas unangenehm.
Wir hatten eine öffentliche Umfrage, bei der 106 Stimmen abgegeben wurden. Es gab 69 Stimmen für “nein” und 37 für “ja”. Eine einfache Division ergibt, dass 69/106 etwa 65,09 % entspricht. Das System zeigt jedoch an, dass 66 % für “nein” und 34 % für “ja” gestimmt haben. Hier ist ein Bild:
Das Endergebnis war 72 Stimmen für “nein” und 38 für “ja” und die Umfrage ist jetzt geschlossen. 72/110 entspricht etwa 65,45 %, was das System ebenfalls auf 66 % rundet, sodass du den Fehler in Aktion auf Tappara.co sehen kannst.
Ich habe versucht, den Code zu durchsuchen, um herauszufinden, was den Fehler verursacht, aber es ist mir nicht gelungen. Ich habe entdeckt, dass eine Funktion namens evenRound aufgerufen wird, aber als ich nach ihrer Quelle gesucht habe, habe ich sie nicht gefunden. Das ist nur eine Vermutung, aber vielleicht rundet diese Funktion die Zahl auf die nächste gerade ganze Zahl?
Das Ergebnis ist schrecklich, genau das ist das Problem.
Danke für den Code. Ich konnte ihn einfach nicht finden, was zeigt, wie schlecht ich im Umgang mit GitHub bin. Der Code stammt von Stack Overflow, wo der Autor schreibt:
Ich bin mir nicht sicher, wie genau es sein muss, aber was ich tun würde, wäre, einfach die ersten n Zahlen um 1 zu erhöhen, wobei n die Deckfunktion der Gesamtsumme der Dezimalstellen ist. In diesem Fall ist das 3, also würde ich 1 zu den ersten 3 Elementen addieren und den Rest abrunden. Natürlich ist das nicht super genau, einige Zahlen könnten falsch auf- oder abgerundet werden, aber es funktioniert okay und führt immer zu 100 %.
Es ist keine Überraschung, dass man bei einer so harten Methode seltsame Ergebnisse bekommt. Ich würde vorschlagen, dass wir uns etwas mehr Mühe geben. Dieser Beitrag im selben Thema hat 72 Upvotes, während der Beitrag, von dem der Code stammt, nur 1 hat.
Es gibt viele Möglichkeiten, genau das zu tun, vorausgesetzt, man ist nicht auf die ursprünglichen Dezimaldaten angewiesen.
Die erste und vielleicht beliebteste Methode wäre die Methode des größten Rests.
Was im Grunde bedeutet:
Alles abrunden
Die Differenz zur Summe 100 ermitteln
Die Differenz verteilen, indem man 1 zu den Elementen in absteigender Reihenfolge ihrer Dezimalteile addiert
…
Ich denke, diese Methode wäre die beste Wahl. Sie ist immer noch sehr einfach und liefert viel bessere Ergebnisse. Der aktuelle Code benötigt ein paar weitere Zeilen, um der Funktion mitzuteilen, welche Zahlen aufgerundet werden sollen. Es gibt jedoch noch ein weiteres zu berücksichtigendes Problem. Aus diesem Beitrag im selben Thema:
Die stark bewertete Antwort von Varun Vohra minimiert die Summe der absoluten Fehler und ist sehr einfach zu implementieren. Allerdings gibt es Randfälle, die sie nicht behandelt – was sollte das Ergebnis des Rundens von 24,25, 23,25, 27,25, 25,25 sein? Einer davon muss stattdessen aufgerundet werden.
Der Beitrag schlägt verschiedene Methoden vor, um auszuwählen, welche Zahl auf- und welche abgerundet wird, aber man kann willkürliche Entscheidungen nie vollständig vermeiden. Wenn man nach Perfektion streben möchte, kann man diesen Beitrag weiter lesen, aber in diesen seltenen Spezialfällen wäre ich damit auch zufrieden.
Man würde wahrscheinlich einfach willkürlich das erste oder letzte Element in der Liste auswählen.
Ich hoffe, das hilft. Meine Fähigkeiten wären wahrscheinlich ausreichend, um die Verbesserungen selbst vorzunehmen, wenn ich zuerst ein paar Grundlagen der Syntax studiere. Ich werde es jetzt nicht tun, aber vielleicht irgendwann, falls sich vorher niemand darum kümmert.
Edit. Ich habe den Titel etwas verbessert, indem ich das Wort „broken“ (kaputt) durch „imprecise“ (ungenau) ersetzt habe. Dieses Thema sollte auch nach Contribute > Feature verschoben oder mit dem vorherigen Thema zusammengeführt werden.
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.