Delphi-PRAXiS

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

shmia 24. Mai 2005 13:14


Currency kaufmännisch runden
 
Folgende Funktion rundet den Datentyp Currency auf eine bestimmte Anzahl von Nachkommastellen.
Dabei wird aber nicht die FPU, sondern nur Integer-Arithmetik benutzt.

Delphi-Quellcode:
function RoundCurrency(const Value:Currency; const nk:Integer):Currency;
const
  faktors : array[-3..3] of Integer = (
     10000000, 1000000, 100000, 10000, 1000, 100, 10);
var
  x : Int64;
  y : Int64;
begin
  // Currency hat ja nur 4 Nachkommastellen
  if (nk>=4) or (Value=0) then
  begin
    Result := Value;
    Exit;
  end;
  if nk < Low(faktors) then
    raise EInvalidArgument.CreateFmt('RoundCurrency(,%d): invalid arg', [nk]);


  // Currency nach Int64 casten
  x := PInt64(@Value)^;
  y := faktors[nk];

  if x > 0 then
    x := ((x+(y div 2)) div y)*y
  else
    x := ((x-(y div 2)) div y)*y;

  // Int64 nach Currency casten
  Result := PCurrency(@x)^;
end;
[edit=Chakotay1308]Styleguide: 2 Leerzeichen statt 3. ;) Mfg, Chakotay1308[/edit]

franktron 24. Mai 2005 13:20

Re: Currency kaufmännisch runden
 
Meinste nicht das das auch kürzer geht

Delphi-Quellcode:
Procedure SRound(Stellen: Longint; Var Zahl: Real);
Var
  NBuf: Real;
begin
  NBuf:=IntPower(10,Stellen);
  Zahl:=Zahl*NBuf;
  Zahl:=Trunc(Zahl)+Trunc(Frac(Zahl)*2);
  Zahl:=Zahl/NBuf;
End;
[edit=Chakotay1308]Styleguide. Ordnung muss sein. ;) Mfg, Chakotay1308[/edit]

shmia 24. Mai 2005 13:37

Re: Currency kaufmännisch runden
 
Zitat:

Zitat von franktron
Meinste nicht das das auch kürzer geht
Delphi-Quellcode:
Procedure SRound(Var Zahl : Real;Stellen : Longint);
Var
   NBuf      : Real;
Begin
   NBuf:=IntPower(10,Stellen);
   Zahl:=Zahl*NBuf;
   Zahl:=Trunc(Zahl)+Trunc(Frac(Zahl)*2);
   Zahl:=Zahl/NBuf;
End;

Deine Prozedure ist zwar kürzer, hat aber doch einige "Reibungsverluste".
Der Datentyp Real benützt 64 Bit, hat aber nicht die Genauigkeit wie Currency.
(bei sehr großen Zahlen hat Real keine 4 Nachkommastellen mehr)
Man müsste also schon Extended benützen.

Beim Wandeln von Currency nach Extended wird intern durch 10000 dividiert; in umgekehrter Richtung wird
mit 10000 multipliziert.
Wenn man viel mit Currency arbeitet, können sich die paar Zeilen mehr schon lohnen.
(vielleicht macht ja jemand einen Benchmark Vergleich :angel2: )

CalganX 18. Aug 2005 19:29

Re: Currency kaufmännisch runden
 
shmia hat für das Kaufmännische Runden mit Extended, Double und Float eine eigene, optimierte Routine geschrieben. Zu finden ist sie hier.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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