Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Algorithmen (https://www.delphipraxis.net/28-library-algorithmen/)
-   -   Delphi kaufmännisch runden (https://www.delphipraxis.net/50081-kaufmaennisch-runden.html)

shmia 20. Jul 2005 13:42


kaufmännisch runden
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz