Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Runden
Nano-Ware - Di 08.12.09 14:57
Titel: Runden
Hi,
ich hab ein Problem. Bitte lest es euch genau durch :wink:
und zwar:
Ich möchte, dass z.B. Zahlen wie:
1,44656564455 auf 1,5 aufgerundet wird,
1,94645454545 auf 2,0 aufgerundet wird
...
wie kann ich das mit dem auf und abrunden machen?
der Zahlenraum soll sein, also die Zahlen die nach dem Runden dann darstehen sollen sind:
0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0
keine mehr keine weniger (wobei auch keine der ZU rundenen Zahlen < 0 oder > 5 sind)
Oliver Marx - Di 08.12.09 16:01
Hi,
runden kannst du mit round(). Allerdings ist das Ergebnis immer eine ganze Zahl. Daher musst du in deinem Fall folgendes benutzen:
round(2*x)/2.
Oliver
Nano-Ware - Di 08.12.09 16:06
Gut round kannte ich^^ aber auf die idee mit /2 bin ich nicht gekommen^^ kann es eigentlich sein, dass round immer nur abrundet?
Oliver Marx - Di 08.12.09 16:19
Nano-Ware hat folgendes geschrieben : |
kann es eigentlich sein, dass round immer nur abrundet? |
Nein, Round rundet ab x.5 auf x+1 auf.
Gammatester - Di 08.12.09 16:41
Oliver Marx hat folgendes geschrieben : |
Nano-Ware hat folgendes geschrieben : | kann es eigentlich sein, dass round immer nur abrundet? |
Nein, Round rundet ab x.5 auf x+1 auf. |
Nein! Wenn nicht an den Defaulteinstellungen gedreht wird, ist zb round(2.5)=2! Stichwort: Round to even. Oder wie Delphi sagt: If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called “Banker’s Rounding”
Gruß Gammmatester
Critter - Di 08.12.09 18:31
Hi,
ich zitiere mal aus der Delphi Hilfe:
Delphi Hilfe hat folgendes geschrieben: |
In Delphi rundet Round einen Wert des Typ 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. |
das verfahren hat nichts mit dem Deutschen "Kaufmännischen Runden" zu tun. Unter dem Stichwort solltest du aber hier im Forum wahrscheinlich schon einiges finden.
critter
alzaimar - Di 08.12.09 20:55
Das 'Bankers Rounding' minimiert die bei der Summierung von Geldbeträgen und Zinsen zwangsweise auftretenden Rundungsfehler im Centbereich durch das bereits zitierte Verfahren (odd/even).
Zur nächstgrößeren Ganzzahl kommt man, indem man 0.5 hinzuaddert und dann die Nachkommastellen wegschnibbelt.
Du musst nun nur deine Zahlen, wie auch schon erwähnt mit 2 multiplizieren, aufrunden und wieder durch 2 teilen.
Allgemein geht es so:
Delphi-Quelltext
1: 2: 3: 4:
| Function RundenMitGranularitaet (Zahl, Granularitaet : Double) : Double; Begin Result := Trunc (0.5 + Zahl/Granularitaet)*Granularitaet; End; |
Bei Dir beträgt die Granularität '0.5', denn Dui willst ja in Nullkommafünferschritten runden. Mal sehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| RundenMitGranularitaet (1.49, 0.50) => Trunc (0.5 + 1.49/0.5) * 0.50 => Trunc (0.5 + 2.98) * 0.50 => Trunc (3.48) * 0.5 => 3 * 0.5 => 1.5 |
Bei negativen Zahlen musst Du 0.5 abziehen, sodaß der Code so vollständig ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Function RundenMitGranularitaet (Zahl, Granularitaet : Double) : Double; Var d : Double; Begin if Zahl < 0 then d := -0.5 else d := +0.5;
Result := Trunc (d + Zahl/Granularitaet)*Granularitaet;aet; End; |
edit: Ein paar grenzdebile Grammatikfehler entfernt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!