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;