home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
runde.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-04-15
|
3KB
|
51 lines
(*-------------------------------------------------------------------*)
(* 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;
(*-------------------------------------------------------------------*)