AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi & Runden

Ein Thema von brechi · begonnen am 15. Sep 2009 · letzter Beitrag vom 16. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#1

Delphi & Runden

  Alt 15. Sep 2009, 15:35
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:
function Round(e: Extended): Extended;
begin
  Result := Trunc(e);
  if Frac(e) >= 0.5 then
    Result := Result + 1;
end;
bzw.

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?
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#2

Re: Delphi & Runden

  Alt 15. Sep 2009, 15:38
Math.Ceil fürs Aufrunden und Math.Floor fürs Abrunden.
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Delphi & Runden

  Alt 15. Sep 2009, 15:38
[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 Kaufmännisches Runden
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Delphi & Runden

  Alt 15. Sep 2009, 15:44
@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.
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Delphi & Runden

  Alt 15. Sep 2009, 15:56
In der Hilfe steht aber das es so ist.

Zitat von OH:
In Delphi rundet Round einen Wert des Typs Real auf einen Integerwert.

X ist ein Ausdruck des Typs Real. Round gibt einen Int64-Wert mit dem auf die nächste Ganzzahl gerundeten Wert von X zurück. Liegt X genau in der Mitte zwischen zwei ganzen Zahlen, wird immer die gerade Zahl zurückgeliefert. Dieses Vorgehen beim Runden wird auch als "Banker's Rounding" bezeichnet.

Liegt der gerundete Wert von X außerhalb des Int64-Wertebereichs, wird ein Laufzeitfehler ausgelöst, der mit einer EInvalidOp-Exception behandelt werden kann.

Anmerkung: Die Funktionsweise von Round kann mit der Prozedur Set8087CW oder der Funktion SetRoundMode gesteuert werden.
Gewusst hab' ich das bis eben aber auch nicht...
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Delphi & Runden

  Alt 15. Sep 2009, 16:03
Hmmm, also bleibt alles wie es ist, und ich runde weiterhin mit:
Floor(Val + 0.5) Oder hab ich jetzt etwas übersehen und man kann es doch umstellen?
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#7

Re: Delphi & Runden

  Alt 15. Sep 2009, 16:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Delphi & Runden

  Alt 15. Sep 2009, 16:31
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.
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: Delphi & Runden

  Alt 15. Sep 2009, 17:04
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Delphi & Runden

  Alt 15. Sep 2009, 17:11
Ich dachte mal gehört zu haben, daß man dieses Verhalten wie hier gewünscht ändern kann

http://www.website.masmforum.com/tut...hap1.htm#cword
kann aber auch nichts finden
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:48 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