Thema: Delphi kaufmännisch runden

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 

kaufmännisch runden

  Alt 20. Jul 2005, 14:42
Für kaufmänisches Runden bietet Delphi keine Standard Funktion an.
Die Funktion Round() verwendet arithmetisches Runden, das für kaufmänische Rechnungen nicht brauchbar ist.
siehe auch: http://de.wikipedia.org/wiki/Rundung

Folgende Funktionen eignen sich für den Datentyp Extended, sowie die kleineren Brüder Double und Float.
Zum kaufmänischen Runden von Currency gibt es eine eigene optimierte Funktion:
http://www.delphipraxis.net/internal...ct.php?t=54723

Delphi-Quellcode:
{**************************************************************************
* NAME:    RoundUp
* DESC:    kaufmännisches Runden
*          Die Delphi Funktion Round() wendet das Verfahren
*          "Bankers Rounding" an.
*          Falls ein Zahl auf 0.5 endet wird immer die nächste
*          geradzahlige Ganzzahl geliefert:
*          10.5 -> 10  (abgerundet)
*          7.5  -> 8  (aufgerundet)
*          Der Grund dafür ist, dass bei Summierungen sich die
*          Fehler durch die Rundung statistisch aufheben sollen.
*
*          RoundUp rundet dagegen bei .5 immer auf.
*
* PARAMS:  [-]
* RESULT:  [-]
*************************************************************************}

function RoundUp(X: Extended): Extended;
begin
   Result := Trunc(X) + Trunc (Frac(X) * 2);
end;

{
// Alternative Implementation von RoundUp
function RoundUp(X : Extended) : Int64;
begin
  if X > 0
  then Result := Trunc(X + 0.5)
  else Result := Trunc(X - 0.5);
end;
}


{**************************************************************************
* NAME:    RoundX
* DESC:    kaufmännisches Runden mit Angabe der Nachkommastellen
*          Bsp:  RoundX(1.2345678,2) ==> 1.23
*                RoundX(1.2345678,4) ==> 1.2346
*                RoundX(1529, -2)    ==> 1600
* PARAMS:  Value:Extended; nk:Integer
* RESULT:  Extended
* CREATED: 22-01-2003/shmia
*************************************************************************}

function RoundX(const Value:Extended; const nk:Integer):Extended;
var
   multi: Extended;
begin
   multi := IntPower(10, nk);
   Result := RoundUp(Value*multi) / multi;
end;
Andreas
  Mit Zitat antworten Zitat