Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wechselgeld bestimmen
An(t)on Ym - Sa 15.08.09 19:00
Titel: Wechselgeld bestimmen
Guten Abend ;)
Ich bin gerade dabei, einen kleinen Automaten zu schreiben.
Es läuft ganz gut, bis auf den Wechselgeld-"Auswurf".
Hier der Code für den Button mit Aufschrift "bezahlen".
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TForm1.Button1Click(Sender: TObject); var i50er: integer; i100er: integer; i20er: integer; i10er: integer; zahl: extended; begin i50er:= 0; i100er:= 0; i20er:= 0; i10er := 0; zahl:= 0.00; zahl := StrToFloat(Label8.Caption); if zahl < 0 then begin zahl := zahl * -1; while zahl > 0.00 do begin if zahl >= 1 then begin i100er := i100er + 1; zahl := zahl - 1.00; end else if zahl >= 0.50 then begin i50er := i50er +1; zahl := zahl - 0.50; end else if (zahl >= 0.20) and (zahl < 0.50) then begin i20er := i20er + 1; zahl := zahl - 0.20; end else if (zahl >= 0.10) and (zahl < 0.20) and (zahl < 0.50) then begin i10er := i10er + 1; zahl := zahl - 0.10; end; end; ShowMessage('Rückgeld: ' + #13 + #10 + IntTOStr(i100er) + ' 1€-Stück(e)' + #13 + #10 + IntToStr(i50er) + ' 50c-Stück(e)' + #13 + #10 + IntToStr(i20er) + ' 20c-Stück(e)' + #13 + #10 + IntToStr(i10er) + ' 10c-Stück(e)'); end; end; |
Zum Problem:
Manchmal rattert er einfach durch und gibt mir auch das gewünschte Ergebnis aus und manchmal wiederrum
bleibt das Programm einfach hängen. Per Debugger habe ich herausgefunden, dass es bei einem Wert von "0,1" nicht in die 10c-Schleife eintaucht.
Ich hab keinerlei Ideen mehr und weiß auch nicht, wo anzufangen ist, da ich es mir nicht erklären kann.
Deshalb frage ich hier und hoffe auf kompetente Hilfe. :)
Vielen Dank für die Aufmerksamkeit und einen schönen Abend,
Anton
Flamefire - Sa 15.08.09 19:25
Floats sind immer problemhaft
du kannst nicht 2 floatingpoint werte auf gleichheit prüfen, da 0,1 zb mal 0,10000000000000000000000000000001 ist
machs da einfacher: multipliziere das ganze mit 100 und rechne alles in cent
erst beim ergebnis rechnest du zurück
elundril - Sa 15.08.09 19:39
du könntest aber auch currency verwenden, da dieser Datentyp ja extra für Berechnungen mit Geld eingeführt wurde. (Quelle: DOH)
lg elundril
An(t)on Ym - Sa 15.08.09 21:01
elundril hat folgendes geschrieben : |
du könntest aber auch currency verwenden, da dieser Datentyp ja extra für Berechnungen mit Geld eingeführt wurde. (Quelle: DOH)
lg elundril |
Danke, mit Curreny hats gepasst.
edit:
Flamefire hat folgendes geschrieben : |
Floats sind immer problemhaft
du kannst nicht 2 floatingpoint werte auf gleichheit prüfen, da 0,1 zb mal 0,10000000000000000000000000000001 ist
machs da einfacher: multipliziere das ganze mit 100 und rechne alles in cent
erst beim ergebnis rechnest du zurück |
Dir natürlich auch ein Danke. ;)
mfg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!