// 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; 


Zugriffe seit 6.9.2001 auf Delphi-Ecke