![]() |
Delphi & Runden
Hallo,
1) Wie kann man in Delphi abstellen, dass bei 2.5 (-> 2) abgerunden wird und bei 3.5 (-> 4) aufgerundet wird? Bisher mache ich es über eine extra Funktion:
Delphi-Quellcode:
bzw.
function Round(e: Extended): Extended;
begin Result := Trunc(e); if Frac(e) >= 0.5 then Result := Result + 1; end; math.SimpleRoundTo(Wert, 0) kann man den RoundMode nicht auf den von TurboPascal umstellen? Das 2. Problem tritt dann bei Tabellen auf, ich habe eine TTable mit einem 5/1 BCD Feld. Diesem weise ich dem Wert 2.25 zu. Da das Feld nur eine Nachkommastelle hat wird gerunden. Auch hier wird auf 2.2 abgerundet, ich hätte aber gerne 2.3. Das Delphi Format ('%5.1f') liefert wie gewünscht auch den Wert 2.3. Natürlich könnte ich beim zuweisen ebenfalls selbst runden, dafür sind mit aber zu viele Änderungen nötigt. Wie kann ich dem Delphi ROUND und dem interen ROUND einer TTABLE also immer sagen, dass bei 0.5 aufgerundet wird? |
Re: Delphi & Runden
Math.Ceil fürs Aufrunden und Math.Floor fürs Abrunden.
|
Re: Delphi & Runden
[equote="die OH sagt bei 'Round'"]Anmerkung: Die Funktionsweise von Round kann mit der Prozedur Set8087CW oder der Funktion SetRoundMode gesteuert werden. [/equote]
PS: dieses Verhalten nennt sich ![]() |
Re: Delphi & Runden
@Forlan: Ist mir schon klar, aber ich willst nicht händich machen.
@Himitsu, Sowohl das kaufmännische Runden als auch die SetRoundMode Funktion waren mir bekannt. Jeder der 4 Modi (rmNearest, rmDown, rmUp, rmTruncate) liefert mir mit Round(2.5) jedoch eine 2 zurück. Nach Set8087CW google ich mal. |
Re: Delphi & Runden
In der Hilfe steht aber das es so ist.
Zitat:
|
Re: Delphi & Runden
Hmmm, also bleibt alles wie es ist, und ich runde weiterhin mit:
Delphi-Quellcode:
Oder hab ich jetzt etwas übersehen und man kann es doch umstellen? :gruebel:
Floor(Val + 0.5)
|
Re: Delphi & Runden
Korrektur:
Die Delphi Funktion ROUND rundet immer mit rmNearest. Die Delphi Funktion math.RoundTo rundet mit dem RoundMode. -> Trunc(RoundTo(2.5,0)) liefert: rmNearest: 2 rmDown: 2 rmUp: 3 rmTruncate: 2 wobei rmNearest eben Bankers Round ist. Das Problem ist jetzt: Format benutzt immer den wissenschaftlichen modus bei Format('%5.0f',[2.5]) kommt 3 raus. Bei der Zuweisung eines Variants in einer Tabelle wird aber der Bankers Round-Mode verwendet (und liefert 2) bei BCD 5.1. Ich will aber jetzt IMMER, sowohl bei Format als auch in TTable (und am liebsten auch in Round) den Wert 3 rausbekommen. |
Re: Delphi & Runden
Round + SetRoundMode(rmNearest) = normal (Round)
Round + SetRoundMode(rmDown) = Floor Round + SetRoundMode(rmUp) = Ceil Round + SetRoundMode(rmTruncate) = Trunc [edit] OK, dann RoundTo ... dachte das zählt auch für Round (hatte es aber auch noch nie verwendet oder getestet) für Set8087CW schau dich mal nach dem ASM-Befehl FLDCW um, hab jetzt auch keine direkte Beschreibung der Bitmaske gefunden. |
Re: Delphi & Runden
So wie ich es bisher rausgefunden habe, wird immer Bankers-Round benutzt und hab ich habe keine Möglichkeit gefunden das jetzt direkt in der FPU auf kaufmännisches Runden umzustellen.
Demnach muss ich mir wohl doch eine Funktion schreiben die dem Feld der Tabelle mit Hilfe der Felddef die richtige Größe zuweist. Falls jemand eine andere Lösung findet, bitte posten :) |
Re: Delphi & Runden
Ich dachte mal gehört zu haben, daß man dieses Verhalten wie hier gewünscht ändern kann :gruebel:
![]() kann aber auch nichts finden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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