home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------*)
- (* RUNDE.PAS *)
- (* eine Loesung zum korrekten kaufmaennischen Runden *)
- (* *)
- (* Aufruf: ergebnis := Runden(Ausdruck, Nachkommastellen); *)
- (* Bsp.: x := Runde(y,2); y := Runde(preis*rabatt,2) usw. *)
- (*-------------------------------------------------------------------*)
-
- FUNCTION Runde (wert: REAL; n: INTEGER): REAL;
-
- VAR tmpstr : STRING [80];
- ziffer : CHAR;
- x : INTEGER;
- ueberlauf, negativ: BOOLEAN;
-
- BEGIN
- negativ := wert < 0; (* Vorzeichen merken *)
- wert := abs(wert);
- Str (wert:0:24, tmpstr); (* REAL -> Zeichenkette. Ergibt
- mit ':0:24' immer soetwas:
- ###.#########... *)
- x := Succ(Pos('.', tmpstr)+n); (* zu rundente Stelle suchen *)
- ziffer := tmpstr[x];
- delete(tmpstr, x, 80); (* Rest abschneiden... *)
- IF ziffer >= '5' THEN (* Das Ganze nur, wenn unbe- *)
- BEGIN (* dingt noetig, sonst *)
- REPEAT (* genuegt abschneiden. *)
- x := Pred(x); (* vorhergehende Stelle nehmen.*)
- ziffer := tmpstr[x]; (* wg. Geschwindigkeit ! *)
- IF ziffer IN ['0'..'9'] THEN (* Dezimalpunkt ? nein... *)
- BEGIN
- ziffer := Succ(ziffer); (* Eins addieren... *)
- ueberlauf := ziffer > '9';
- IF ueberlauf THEN (* Ueberlaufkorrektur ? *)
- ziffer := '0';
- tmpstr[x] := ziffer;
- END;
- UNTIL (x = 0) OR NOT ueberlauf; (* bis keine Stellen mehr vor-
- handen oder keine Korrektur
- mehr notwendig ist *)
- IF (x) = 0 THEN (* auf zur naechsten Zehner- *)
- Insert('1', tmpstr, 1); (* potenz, wenn notwendig! *)
- END;
- Val (tmpstr, wert, x); (* Zeichenkette -> REAL *)
- IF negativ THEN (* altes Vorzeichen nicht verg.*)
- wert := -1*wert;
- Runde := wert;
- END;
-
- (*-------------------------------------------------------------------*)