“Jeder Fehler findet einen Dummen, der ihn macht."

Abstract

Es zirkulieren mehrere verschiedene naive Ansätze für das summenerhaltende Runden:

  • (der schlechteste) Runde alle Werte mit Ausnahme des Letzten und ersetze dann den letzten Wert durch die Differenz der gerundeten Originalsumme minus der Summe der vorher gerundeten Werte (d.h. aggregiere alle Rundungsfehler im letzten Summanden).
  • (besser, aber immer noch schlecht) Wende das gleitende Runden an (siehe unten).

Vergleichen wir beide Ansätze mit RoundToSum.

Rechenbeispiel

[Dieses Beispiel ist auch in der Download Datei bei RoundToSum enthalten.]

Wir erzeugen 40 Zufallszahlen ZUFALLSZAHL() * 1000 und vergleichen wie folgt:

RoundToSum_vs_Others

Wie man sieht, erhalten wir einen aggregierten Rundungsfehler in Höhe von -0,03, wenn wir alle Werte einfach einzeln runden. Spalte J (VIII) zeigt die Differenz des aggregierten Rundungsfehlers von -0,03 im letzten Summanden. Spalte F (IV) zeigt die korrespondierenden gerundeten Werte. Im schlimmsten Fall würden Sie hier einen aggregierten Rundungsfehler von n * 0,005 erhalten, wobei n die Anzahl der Zahlen ist. Beispiel: Nehmen Sie an Stelle der 40 Zufallszahlen 40-mal die Zahl 0,005.

Der Ansatz des gleitenden Rundens in Spalte I (VII) zeigt 11 Rundungen zur falschen Seite. Spalte E (III) zeigt die korrespondierenden gerundeten Werte. Beim gleitenden Runden können Sie im schlimmsten Fall die Hälfte der Zahlen zur falschen Seite runden, obwohl alle Zahlen korrekt gerundet werden könnten. Beispiel: Nehmen Sie an Stelle der 40 Zufallszahlen 20-mal die Zahl -0,0049999 und dann 20-mal die Zahl 0,0049999.

Im Gegensatz dazu rundet das optimale RoundToSum lediglich 3 Werte zur falschen Seite und wendet die geringste Anzahl von Änderungen an, um die korrekte gerundete Gesamtsumme mit dem kleinsten absoluten Fehler zu erhalten. Im schlimmsten Fall würden Sie nun n/2 Male zur falschen Seite runden müssen, wobei n die Anzahl der Zahlen ist. Beispiel: Nehmen Sie an Stelle der 40 Zufallszahlen erneut 40-mal die Zahl 0,005. Es ist jedoch die beste Lösung mit dem kleinsten absoluten Rundungsfehler für jede Zahl und danach mit der geringsten Anzahl von Rundungen zur falschen Seite.

Zusammenfassung

Verwenden Sie RoundToSum. Es wendet die geringste Anzahl von Änderungen an, um die korrekte gerundete Gesamtsumme mit dem kleinsten absoluten (oder relativen) Fehler zu erhalten. Eine Matrixformel ist unabdingbar, weil sich alle n > 1 Eingabewerte auf alle n > 1 Ausgabewerte auswirken.

Ein gleitendes Runden - wie oben in Zelle E6 mit der Formel =RUNDEN(SUMME($C$5:$C5);2)-SUMME($E$4:$E4) gezeigt - benötigt kein VBA und auch keine Matrixformel, aber es kann leicht wesentlich mehr unnatürliche Rundungen aufweisen, die man nur schwerlich erklären kann.

Am schlimmsten ist jedoch der dumme Ansatz, alle Rundungsdifferenzen zur originalen gerundeten Summe in einer (hier: der letzten) Zelle zu aggregieren. Man stelle sich 1.000 Menschen mit je 49 Cent in der Tasche (also insgesamt 490 EUR) vor. Wenn Sie diese Beträge fair auf ganze Euro verteilen wollen, würde bei diesem Ansatz der Letzte die gesamten 490 Euro erhalten. RoundToSum gäbe den ersten 490 Personen je einen Euro und allen anderen Null Euro.