// Hiermit kann man
eine Gleitkommazahl auf eine bestimmte Anzahl von
// Nachkommastellen
runden.
// Getestet mit D4 unter WinME
// Variante 1
function rund(zahl: extended; kommastellen: byte): extended;
begin
result := strtofloat(formatfloat('0.' + stringofchar('0', kommastellen), zahl));
end;
// Beispielaufrufe
procedure TFormx.Button5Click(Sender: TObject);
var r: double;
begin
r := 23 / 8;
showmessage(floattostr(r)); // 2,875
r := rund(r, 2);
showmessage(floattostr(r)); // 2,88
r := rund(r, 0);
showmessage(floattostr(r)); // 3
end;
// Variante 2
// Auf mehreren
Seiten im Internet fand ich diese
(bzw. ähnlich gelagerte)
// schnelle Variante:
uses math;
function RoundX(zahl: extended; kommastellen: byte): extended;
var
p10: extended;
begin
p10 := Power(10.0, kommastellen);
if zahl >= 0 then result := floor(zahl * p10 + 0.5) / p10 else
result := ceil(zahl * p10 - 0.5) / p10;
end;
// Die Gefahr bei
diesen Varianten: Wenn "kommastellen" größer ist
// als die tatsächlichen Nachkommastellen, kommt es zu gravierenden
Fehlern:
roundx(1.23456789, 11) ergibt -0,01097262584 !!!
// Deshalb hier mein Vorschlag:
uses math;
function RundX(zahl: extended; kommastellen: byte): extended;
var
p10: extended;
begin
p10 := Power(10.0, kommastellen);
result := round(zahl * p10) / p10;
end;
// Wer aber ab der 5 aufrunden möchte, könnte so etwas machen:
uses math;
function Rund(zahl: extended; kommastellen: byte): extended;
var
p10: extended;
s: string;
begin
p10 := Power(10.0, kommastellen);
s := FloatTostr(zahl);
s := copy(s, pos(Decimalseparator, s) + 1, maxint);
s := copy(s, kommastellen + 1, 1);
if s >= '5' then zahl := zahl + 0.5 / p10;
result := round(zahl * p10) / p10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var d: double;
begin
d := rund(6.85, 1);
showmessage(FloatToStr(d));
end;
|