Fischer-Bayern.de
Letztes Update: 12.01.2005 | 1:11:22 Uhr
Zahlen runden 
Peter Fischer

Dieser Artikel befasst sich damit, wie mittels AppleScript Zahlen gerundet werden können. Um eines gleich vorweg zu nehmen: Die vorhandene Rundungsfunktion der Standard Additions bietet nur sehr unzureichende Möglichkeiten an.

Hier der Auszug aus dem Befehlsverzeichnis:
round: Round number to integer
   round  real  -- the number to round
      
      [rounding  
      up/down/toward zero/to nearest/as taught in school]
  -- the rounding direction; if omitted, rounds to
 nearest.  “to nearest” rounds .5 cases to the nearest
  even integer in order to decrease cumulative errors.  To always
   round .5 away from zero, use “as taught in school.”
   
Result:   integer  -- the rounded value

Hier die einzelnen Möglichkeiten:

set x to 23.4
round x
		--> 23
set y to 23.5
round y
		--> 24

Mit dem Parameter 'rounding' kann man die Rundungsrichtung beeinflussen.

set x to 23.4
round x rounding up
		--> 24
set x to 23.7
round x rounding down
		--> 23
set x to 23.92
round x rounding toward zero
		--> 23
set x to 23.5
round x rounding to nearest
		--> 24
set x to 0.5
round x rounding as taught in school
		--> 1

Wie man schon dem Befehlsverzeichnis entnehmen kann, wird das Ergebnis immer eine Ganzzahl sein. Was ist aber, wenn man Nachkomma-Stellen runden muss?

Hier wird die Sache schon wesentlich schwieriger.
Im AppleScript-Forum beschrieb Juegi eine sehr einfache Möglichkeit:

set x to 125.955

(round (x * 100)) / 100
Ergebnis: 125.96

Zunächst werden 2 Nachkommastellen durch die Multiplikation mit 100 'entfernt' und dann durch die Division wieder hergestellt.

Hier hat man keinen Einfluss auf die Rundungsrichtung und die Dezimalstellen werden mit Punkt statt mit Komma getrennt.

Das Komma bekommt man, wenn man die Zahl in einen Textwert umwandelt:
set x to 125.955

((round (x * 100)) / 100) as text
Ergebnis: "125,96"

Eine weitere Methode wäre, die Zahl zu zerlegen und den Teil vor und nach dem Komma getrennt zu behandeln.
set x to 125.987

set y to x div 1
set x to x + 0.005
set z to (x mod 1) div 0.01
set z to z / 100

set Summe to y + z
Bei dieser Version kommen wir ohne den Befehl 'round' aus. Die eigentliche Rundung findet in der dritten Zeile statt.

Aber der Reihe nach:
Die erste Zeile ist noch klar - hier steht nur unsere ungerundete Zahl. In der zweiten Zeile wird der Teil vor dem Komma in die Variable y verfrachtet.
x div 1 ist eine Division, bei der nur Ganzzahlen als Ergebnis geliefert werden. Die Nachkommastellen fallen hier weg.

In der dritten Zeile wird die dritte Nachkommastelle unserer ursprünglichen Zahl erhöht. Ab einer 5 an der dritten Nachkommastelle wird so automatisch die zweite Nachkommastelle ebenfalls höher. Es findet also eine Aufrundung statt.

Jetzt werden die Nachkommastellen behandelt:

set z to x mod 1

So werden sie ermittelt. Ergebnis: 0.992

Also 0.987 + 0.005. Wir hatten x ja schon erhöht. Da wir aber nur zwei Stellen wollen brauchen wir noch den Ausdruck
set z to x div 0.01

Ergebnis: 99

Zusammengefasst ergibt es unsere vierte Zeile:

set z to (x mod 1) div 0.01

Und da wir nicht 99 brauchen, sondern 0.99 folgt noch eine Division durch 100.

Jetzt werden die beiden Teile wieder zusammengesetzt.

Sie werden sich jetzt fragen, warum man es so kompliziert machen soll, wenn es doch wesentlich einfacher auch geht (siehe erstes Beispiel). Nun, das zweite Beispiel werden wir gleich noch brauchen. Beide Methoden haben nämlich einen entscheidenden Schönheitsfehler. Mit höheren Zahlen funktionieren sie nicht.

AppleScript steigt nämlich bei höheren Zahlen automatisch auf die wissentschaftliche Darstellung um.

Beispiel: 12345.987 wird als 1.2345987E+4 dargestellt. Das ist natürlich für unseren Skripter-Alltag nicht unbedingt brauchbar.
set x to 1.2345987E+4

((round (x * 100)) / 100) as text
Ergebnis: "1,234599E+4"

Hier hilft uns nur ein wesentlich komplexeres Skript weiter, das so eine Zahl in einen Text umwandelt und dann entsprechend bearbeitet.

Hier ist es:
set dieZahl to 1.2345987E+4
Rundung(dieZahl)

on Rundung(dieZahl) set dieZahl to dieZahl + 0.005 -- hier wird die -- dritte Nachkommastelle erhöht. Ist diese -- >= 5 erhöht sich dadurch die zweite -- Nachkommastelle = Aufrundung set Teil1 to TextConvert(dieZahl div 1) set Teil2 to (dieZahl mod 1) div 0.01 -- zwei Nachkommastellen if Teil2 < 10 then set Teil2 to ("0" & Teil2 as text) as string set Summe to (Teil1 & "," & Teil2 as string) return Summe end Rundung
on TextConvert(dieZahl) set TextZahl to dieZahl as text if TextZahl contains "E+" then set x to offset of "," in TextZahl set y to offset of "+" in TextZahl set z to offset of "E" in TextZahl set Dezimal to ¬ characters (y - (length of TextZahl)) ¬ thru -1 of TextZahl as string as number if x is not 0 then set Teil1 to characters 1 thru (x - 1) of TextZahl as string else set Teil1 to "" end if set Teil2 to ¬ characters (x + 1) thru (z - 1) of TextZahl as string set convZahl to Teil1 repeat with i from 1 to Dezimal try set convZahl to convZahl & character i of the Teil2 on error set convZahl to convZahl & "0" end try end repeat return convZahl else return TextZahl end if end TextConvert


Nun wünsche ich viel Spass beim Studieren des Skripts.



 

 

Workshop



snow@fischer-bayern.de

Ebene 1