Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Runden und Currency (https://www.delphipraxis.net/25770-runden-und-currency.html)

Mario 12. Jul 2004 10:51


Runden und Currency
 
Hallo,

ich habe folgenden Test mit Currency (Delphi 7) gemacht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var cur: Currency;
begin
  cur := 2000.5; // -> Ausgabe 2000 EUR
  ShowMessage(CurrToStrF(cur, ffCurrency, 0));

  cur := 1.5; // -> Ausgabe 2 EUR
  ShowMessage(CurrToStrF(cur, ffCurrency, 0));
end;
Einmal wird auf und einmal abgerundet? Habe ich hier einen Denkfehler oder ist es ein Fehler in Delphi?

neolithos 12. Jul 2004 10:54

Re: Runden und Currency
 
Delphi rundet Kaufmännisch!

bei 0.5

ungerade Zahlen -> aufrunden
gerade Zahlen -> abrunden

Addiere die 2000.5 bzw. 1.5 mit 0.05 und schon rundet Delphi richtig

Mario 12. Jul 2004 11:00

Re: Runden und Currency
 
Oh danke, dass erklärt natürlich einiges.

Gibt es auch Delphi-Funktionen, die normal runden? Der Workaround ist zwar eine Lösung, aber ich nutze gern gekapselte fertige Funktionen.

shmia 12. Jul 2004 11:03

Re: Runden und Currency
 
Zitat:

Zitat von Mario
Einmal wird auf und einmal abgerundet? Habe ich hier einen Denkfehler oder ist es ein Fehler in Delphi?

Delphi verwendet "Banker's rounding". Die Auf- und Abrundungen sollen sich in der Masse gegenseitig aufheben.
Kaufmännisches Runden geht so:
Delphi-Quellcode:
function CommercialRound(const X: Float): Int64;
begin
  Result := Trunc(X);
  if Frac(Abs(X)) >= 0.5 then
    Result := Result + Sgn(X);
end;

ibp 12. Jul 2004 11:06

Re: Runden und Currency
 
schreib dir selber eine, oder ...
Delphi-Quellcode:
gerundetezahl:=trunc(zahl+0.5)


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