Aufrunden von Umfrageprozenten ist ungenau

Fortsetzung der Diskussion Rundung von Prozentwerten in Umfragen ist ungenau:

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?

Not sure I understand what’s broken here. The poll will round the % so they add up to 100%.

1 „Gefällt mir“

Das Ergebnis ist schrecklich, genau das ist das Problem. :slight_smile:

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:

  1. Alles abrunden
  1. Die Differenz zur Summe 100 ermitteln
  1. 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.

4 „Gefällt mir“

Feel free to submit a pull request to change the rounding algorithm :wink:

5 „Gefällt mir“

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.

https://github.com/rizka10/discourse/pull/1/files

2 „Gefällt mir“

Looks fine to me. Would you mind making it a PR so that I can merge it?

I thought that was a pull request already… I’m as confused as always with Github. :confused:
I clicked some more green buttons now, maybe it does the trick?

If you want to create a PR from your code, you should go there: https://github.com/discourse/discourse/compare/master...rizka10:master :wink:

1 „Gefällt mir“

I think I’m getting it now. I ran into some Github tutorials online yesterday and I should really go through one to learn the basics.

1 „Gefällt mir“

Awesome. Before we can merge the code, we’ll need you to sign the CLA. I promise, this is the last step (also, you only have to sign it once ;))

6 „Gefällt mir“

Thanks for all the help! I signed it now.

4 „Gefällt mir“