AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Algorithmen Delphi kaufmännisch runden
Thema durchsuchen
Ansicht
Themen-Optionen

kaufmännisch runden

Ein Thema von shmia · begonnen am 20. Jul 2005
Antwort Antwort
shmia

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

kaufmännisch runden

  Alt 20. Jul 2005, 13: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
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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