![]() |
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:
[edit=Chakotay1308]Styleguide: 2 Leerzeichen statt 3. ;) Mfg, Chakotay1308[/edit]
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; |
Re: Currency kaufmännisch runden
Meinste nicht das das auch kürzer geht
Delphi-Quellcode:
[edit=Chakotay1308]Styleguide. Ordnung muss sein. ;) Mfg, Chakotay1308[/edit]
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; |
Re: Currency kaufmännisch runden
Zitat:
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: ) |
Re: Currency kaufmännisch runden
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz