Rundungsfunktionen in RagTime

20 Jul 2010 - 15:03

Übersicht

Seit Version 6.5 gibt es in RagTime mehr Rundungsfunktionen:

  • Ganzzahl(Zahl)
  • Kürzen(Zahl[;Stellen])
  • Obergrenze(Zahl[;Vielfaches])
  • Runden(Zahl[;Stellen])
  • Untergrenze(Zahl[;Vielfaches])

»Ganzzahl« ist dabei genau genommen inzwischen überflüssig, die Funktion tut dasselbe wie »Untergrenze« mit nur einem Argument (oder 1 als zweitem Argument).

Die Funktionen unterscheiden im Übrigen sich in zwei Aspekten: In welche Richtung sie runden und ob man eine Stellenanzahl oder ein Vielfaches für die Rundungsgenauigkeit angeben kann.

»Ganzzahl« rundet immer auf die nächste Ganzzahl, die kleiner oder gleich ist (also Richtung -?).

»Kürzen« mit einem Argument schneidet die Nachkommastellen ab, rundet also zur nächsten Ganzzahl, die gleich oder dichter an 0 ist.
Gibt man »Stellen« an, kann man eine bestimmte Anzahl von Nachkommastellen erhalten, oder auch bei negativem Argument links vom Komma kürzen: »Kürzen(-123,456;2)« liefert »-123,45«. Dagegen liefert »Kürzen(-123,456;-2)« den Wert »-100«.

»Obergrenze« mit einem Argument rundet immer zur Ganzzahl, die größer oder gleich ist (Richtung +?). Wird im zweiten Argument ein positives Vielfaches gegeben, rundet »Obergrenze« zum nächsten Vielfachen dieser Zahl, die größer oder gleich ist. »Obergrenze(-123,456;5)« ergibt »-120«, das nächst-größere Vielfache von 5. Man kann als Vielfache auch Zahlen mit Kommastellen benutzen. »Obergrenze(-123,456;0,1)« rundet auf eine Nachkommastelle genau nach oben.
Benutzt man als zweites Argument eine negative Zahl, verhält sich »Obergrenze« wie die Funktion »Untergrenze« mit entsprechendem positiven Argument. »Obergrenze(A1;-5)« ist also gleich »Untergrenze(A1;5)«.

»Runden« mit einem Argument rundet zur nächstgelegenen Ganzzahl. Werte genau in der Mitte zwischen zwei Ganzzahlen (»x,5«) werden von 0 weg gerundet (also betragsmäßig nach oben). Wie bei »Kürzen« kann eine Anzahl von Stellen festgelegt werden. »Runden(A1;2)« rundet den Wert in A1 auf zwei Nachkommastellen genau.

»Untergrenze« verhält sich analog zu »Obergrenze«, nur je in die andere Richtung, nämlich -? (+? bei negativem zweiten Argument).

Hier noch einmal als tabellarische Übersicht:


Runden
Ganzzahl
Kürzen
Obergrenze
Untergrenze
Richtung
nächster Wert
minus unendlich
Null
plus unendlich
minus unendlich
Vielfaches
Zehnerpotenz
1
Zehnerpotenz
beliebig
beliebig

Unerwartete Effekte

Es gibt hier »Schweinereieffekte«, sobald Nachkommastellen vorhanden sind: Einfach aussehende Dezimalzahlen ergeben oft im Dualsystem periodische Brüche. Schwellwerte sind deshalb bei dual rechnenden Computern nie ganz zuverlässig. (Vergleich auch die Diskussion zur Ganzzahlgenauigkeit von AppleScript.) So ergibt »Runden(1,005;2)« den eigentlich unkorrekten Wert 1. Gegen diese Effekte ist ein einer Mischwelt aus Dezimalzahlen und Dualzahlen leider kein Kraut gewachsen. Schwellwerte haben bei Zahlen mit Dezimalstellen ein Ungenauigkeitsrisiko, sobald dual gerechnet wird.

Berechnungstricks

Funktionen, die wie »Runden« mit Nachkommastellen und nicht mit einem Vielfachen arbeiten, können dennoch für Vielfache benutzt werden. Häufig ist der Wunsch, Preise auf eine Genauigkeit von 50 Cent zu runden. Angenommen, in A1 steht der Wert, dann löst »Runden(A1*2)/2« die Aufgabe. Man rundet den doppelten Wert und halbiert danach wieder.

Die im Vertrieb so beliebten Preise wie 2,98€ bekommt man mit einem ähnlichen Trick: Vor dem Runden 0,02 addieren, danach wieder subtrahieren: »Runden(A1+0,02)-0,02«. Etwas unübersichtlicher wird die Kombination, wenn man zum Beispiel Preise auf ,48 und ,98 enden lassen will: »Runden(A1*2+0,04)/2-0,02«.

Ein netter weiterer Rundungstrick ist: Runden auf signifikante Stellen. Preise im 10-tausender Bereich sollen auf glatte hunderter gerundet werden, Zahlen im vierstelligen Bereich auf glatte Zehner usw. Der Trick: Der abgerundete Zehnerlogarithmus einer Zahl liefert eins weniger als die Anzahl der Stellen vor dem Komma. »Kürzen(Log10(A1))+1« liefert die Anzahl der Vorkommastellen des Werts in A1, also 3 für »999« und 4 für »1000«. Das richtige Runden auf drei signifikante Stellen löst »Runden(A1;-Kürzen(Log10(A1))+2)«. (Sollen vier Stellen stehen bleiben, muss »+2« durch »+3« ersetzt werden etc.)