Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Di 08.12.09 14:57 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: Di 08.12.09 16:19 
user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
kann es eigentlich sein, dass round immer nur abrundet?


Nein, Round rundet ab x.5 auf x+1 auf.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Di 08.12.09 16:41 
user profile iconOliver Marx hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:

ausblenden 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:
ausblenden 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:
ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.