Runden (round): Rundungsfehler ausgleichen

Wenn ich mit Calc einen Betrag aufteile und die Anteile kaufmännisch runde, kann es sein, dass die Summe der (gerundeten) Anteile leicht vom ursprünglichen Betrag abweicht.

Zum Beispiel:
Wenn ich den Betrag von 15,60 € nach 570,730/1000, 285,365/1000 und 143,905/1000 aufteile, bekomme ich die Anteile 8,903388 und 4,451694 und 2,244918
gerundet: 8,90 €, 4,45 € und 2,24 € - das ergibt zusammen nur 15,59 €.
Gefühlsmäßig würde ich den letzten Teilbetrag (der ja schon nahe bei 2,50 € ist) um einen Cent anheben, damit die Summe wieder 15,60 € ist. Das wäre aber ein willkürlicher manueller Vorgang.

Gibt es eine automatische Methode, um bei solchen Aufteilungen als Summe wieder den Ursprungsbetrag zu erhalten, ohne dass immer die gleiche Partei benachteiligt wird ?

(Libre Office 6.3 mit Windows 7)

Nee - das wird mit kaufmännischem Runden immer Willkür bleiben, Wenn Du 1ct / 3 machst kommt eben 0,33 ct raus und das kaufmnännisch gerundet gibt 3 * 0 ct und damit einen Fehler von 1ct. Da kannst Du in deiner Buchhaltung nur eine Korrekturbuchung von 1ct machen.

Die Anzeige der Währung heißt ja nicht, dass das Ergebnis gerundet wurde. Ich würde da mit mehreren Hilfsspalten arbeiten. Ich gehe einfach einmal davon aus, dass die Ergebnisse in Euro in den Zellen A1, A2 usw. stehen.

Zuerst in B1 … den Rest berechnen, der bei der Rundung nicht berücksichtigt wurde:

=A1-RUNDEN(A1;2)

Dann in C1 … das Maximum davon abfangen:

=WENN(B1=MAX(B1:B3); MAX(B1:B3);0)

Damit siehst Du, bei welchen Werten Du gegebenenfalls statt abzurunden aufrunden solltest oder umgekehrt. Jetzt könntest Du natürlich wagemutig passend zu Deinen Werten

=WENN(C1=0;RUNDEN(A1;2);AUFRUNDEN(A1;2))

… und darunter die Summe ausrechnen, ob die jetzt stimmt.
Aber was machst Du, wenn der Ausschlag in die andere Richtung geht? Dann müsstest Du die nächste Spalte nicht mit MAX sondern mit MIN erstellen und dort den gekennzeichneten Wert dann abrunden.

Leute, die viel mit Calc arbeiten, haben hier vielleicht deutlich einfachere Lösungen.

Ich denke, dass das Problem tatsächlich nicht bei Calc liegt, sondern in der mathematischen Tatsache, dass man einen Euro nicht auf zwei Nachkommastellen genau in drei gleiche Teile aufteilen kann. Die kleinste Münze ist nun mal ein Cent und daher ist 3 x 0,33 € = 0,99 € wohl die genaueste Annäherung an einen vollen Euro.

Ich habe verschiedene Beträge ausprobiert und es ist tatsächlich so, dass die Summe der Teilbeträge sowohl größer als auch kleiner als der Ausgangsbetrag ausfallen kann. Die Rundungsdifferenz automatisch UND gerecht auf die Teilbeträge zu verteilen, würde meines Erachtens einen erheblichen Programmieraufwand erfordern und gerecht würde es wohl nur, wenn das Verfahren berücksichtigen könnte, wohin die Rundungsdifferenz bei den vorangegangenen Aufteilungen zugeteilt wurde.

Ich habe die Frage für mich so gelöst:
Ich bilde noch eine Prüfsumme aus den Teilbeträgen zum Vergleich mit dem Ausgangsbetrag. Dafür habe ich den Berechnungsmodus so eingestellt, dass er mit den angezeigten (zweistelligen und nicht mit den internen, genaueren) Werten weiterrechnet (Extras > Optionen > Berechnen > Genauigkeit wie angezeigt). Wenn die Prüfsumme vom Ausgangsbetrag abweicht, muss man entscheiden, ob man die Ungenauigkeit in Kauf nimmt oder einen Teilbetrag manuell um einen Cent anpasst.

Ich habe mal in einer Buchhaltung gesehen, dass Rundungsdifferenzen auf ein besonderes Buchungskonto gebucht wurden. Das hatte keinen hohen Saldo, weil sich die Abweichungen oft ausglichen. Wäre der Saldo zu hoch geworden, hätte man ihn nach einem allgemeinen Umlageschlüssel auf die Beteiligten ausbuchen können.

Hallo lieber nurmik,

dein Problem hat mich doch noch eine ganze Weile beschäftigt. Natürlich haben die Kollegen die bereits geantwortet haben, vollkommen recht. Das Problem lässt sich nicht vollkommen sauber lösen. Vorher Runden ist immer die schlechteste Wahl.

Wenn aber einem keine Wahl bleibt, dann muss man es halt machen. Um dir eine Hilfe zu geben, hatte ich ursprünglich eine Formel geschrieben, die das Problem wie folgt, löst. Bei einem oder mehreren Summanden, muss eingegriffen werden. Doch bei welchem? Immer der Eintrag der am nähsten an der anderen Rundungsrichtung dran ist. Also in deinem Fall wie du schon geschrieben hast die 2,244918 nicht abrunden, sondern aufrunden. Nachdem die Formel schon fertig war, habe ich gemerkt, dass sie viel zu kompliziert ist und auch nur für drei Zahlen wie in deinem Beispiel funktioniert.
Daher habe ich nochmal von vorne begonnen und eine Benutzerfunktion geschrieben. Die Funktion habe ich SRUNDEN() getauft. Wie SummeRunden. Du kannst sie aber jederzeit umbenennen. Ist ja nur Lokal.

Sie macht genau das, was du möchtest. Automatisiert die Rundung beeinflussen. Du musst eine Matrix mit Zellen auswählen. Dort stehen bereits deine nicht gerundeten Ergebnisse. Dann brauchst du noch die Nachkommastellen und abschließend den Index des Ergebnisses. Das Problem ist nämlich das, das Ergebnis auch eine Matrix ist. Ohne den Index würde man immer nur den ersten Eintrag erhalten.
Die Funktion korrigiert eine oder mehrere Zahlen, wenn erforderlich so das die Summe der gerundeten Ergebnisse mit denen der später gerundeten übereinstimmt.

Um das mal etwas zu veranschaulichen und zu testen, habe ich eine Tabelle gemacht, die 50 Zeilen mit Zufallszahlen und 7 Summanden hat. Du kannst das gerne auch noch nach unten verlängern. Ich musste den Test etwas kürzen, um die Datei hier noch hochladen zu können. Die Summe und die gerundete Summe werden ausgegeben. Im zweiten Block wird erst gerundet und dann die Summe gebildet. In Spalte R kann man ablesen, wie oft das zu Rundungsfehlern führt. Im dritten Block wird meine Funktion verwendet. Hier werden alle Rundungsfehler ausgeglichen.

Damit bei dir die Funktion funktioniert, musst du diese zunächst bei dir als Funktion einfügen. Du musst wie folgt vorgehen: [Extras] [Makros] [Makros verwalten] [LibreOffice Basic]. Dann [MeineMakros] [Standard] anklicken und dann [Verwalten] wählen. Dann wieder bei [Standard] [Neu] klicken. Bei neues Modul „Funktionen“ schreiben und [OK] klicken. Dann links [Meine Makros] [Standard] [Funktionen] wählen und [Bearbeiten] klicken. Dort dann Code rein kopieren und [Speichern] klicken. Bitte darauf achten, dass du außerhalb eines bestehenden Sub’s bist. Leider konnte ich die *.bas Datei hier nicht hochladen. Damit hätte man den Code auch importieren können. So bitte aus dem Writerdokument heraus kopieren. Bitte darauf achten das alles aus dem Writerdokument kopiert wird. Am besten mit STRG + A alles markieren. Strg + c kopieren und dann einfügen.

An alle Besserwisser: Ich bin kein VBA Profi. Ich habe sicherlich schrecklich viele Fehler gemacht. Damit kann ich leben. Hauptsache es funktioniert. Jeder der Interesse hat, kann den Code gerne verbessern und optimieren.

Und an die Mathematik-Enthusiasten: Ja ich habe die Zahlen verändert. Das war auch das Ziel! Behaltet dahingehend euren Kommentar für euch.

SRUNDEN.odt

Beispiel SRUNDEN.ods

Eine kleine Einschränkung. Bei sehr vielen Nachkommastellen (>4), rundet Calc VBA manchmal nicht richtig. Wer das reparieren kann bitte los! Die auskommentierte Zeile 46.

So jetzt aber viel Spaß mit automatisiert Rundungsfehler ausgleichen!

lg

Jürgen