Autor Beitrag
An(t)on Ym
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 15.08.09 19:00 
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".

ausblenden volle Höhe 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);  // Restgeld im Minusbereich
if zahl < 0  then
begin
zahl := zahl * -1;                  // Umwandeln in positive Zahl
   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.20and (zahl < 0.50then
      begin
        i20er := i20er + 1;
        zahl := zahl - 0.20;
      end else if (zahl >= 0.10and (zahl < 0.20and (zahl < 0.50then
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
An(t)on Ym Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 15.08.09 21:01 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
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