Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit aufrunden
GiuStyler - Mi 17.09.14 11:07
Titel: Probleme mit aufrunden
Hallo Leute,
nachdem ich zuletzt an meinem Taschenrechner gearbeitet habe, was aktuell noch nicht fertig ist, aber ich immer noch auf meinem Hauptchef warten muss der auf Geschäftsreise ist, hat mir mein anderer Chef eine Neue Aufgabe gegeben und zwar.
Ich soll ein Programm schreiben, wo ich ein Betrag eingebe und nach drücken von OK, soll die Anzahl der Münzen erscheinen. Zusätzlich habe ich noch hinzugefügt das ich angezeigt bekommen wie oft welchen Wert benutzt wurde.
Problem ist nun bei 0.01 macht er mir manchmal Probleme, da meine Zahl Real ist und am Ende statt 0,01 meistens 0,00999999 steht.
wie kann ich das nun Runden? habe schon versucht mit RountTo eine eigene function etc. irgendwie kriege ich es nicht hin. Kann mir einer sagen was ich genau machen muss?
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:
| procedure TFormGeldbetragumwandler.BitBtnOKClick(Sender: TObject); var B : real; M: Integer;
Münzen : array[1..8] of Integer; begin B := StrToFloat(EditEingabe.Text); M := 0;
Münzen[1] := 0; Münzen[2] := 0; Münzen[3] := 0; Münzen[4] := 0; Münzen[5] := 0; Münzen[6] := 0; Münzen[7] := 0; Münzen[8] := 0;
while B >= 2 do begin M := M+1; B := B-2; Münzen[1] := Münzen[1]+1; end;
. . .
while B >= 0.01 do begin M := M+1; B := (B-0.01); Münzen[8] := Münzen[8]+1; end;
LabelAusgabe.Caption := 'Es sind insgesamt '+FloatToStr(M)+' Münzen enthalten'; LabelAusgabe2.Caption :='Folgende Münzenvarianten sind vorhanden:'+#13+IntToStr(Münzen[1])+' * 2 €' ... +#13+IntToStr(Münzen[8])+' * 0,01 €'; |
Danke für jede Hilfe.
MfG
WasWeißDennIch - Mi 17.09.14 11:39
Das sind ganz normale Rundungsungenauigkeiten. An Deiner Stelle würde ich entweder den Datentyp Currency verwenden oder einfach intern in Cent umrechnen, dann kannst Du mit ganzen Zahlen hantieren.
GiuStyler - Mi 17.09.14 12:02
Danke.
Habs aber nun anders erledigt. Hatte es vorher schon fast richtig
Ich hatte nur eine Kleinigkeit vergessen. Mein Chef hat mich nun drauf hingeweisen
Ich hatte es so
Delphi-Quelltext
1: 2: 3: 4: 5:
| begin M := M+1; RoundTo((B-Münzwert[1]), -2); Münzen[1] := Münzen[1]+1; end; |
aber es sollte so sein
Delphi-Quelltext
1: 2: 3: 4: 5:
| begin M := M+1; B := RoundTo((B-Münzwert[1]), -2); Münzen[1] := Münzen[1]+1; end; |
Nersgatt - Mi 17.09.14 12:23
GiuStyler hat folgendes geschrieben : |
Habs aber nun anders erledigt. Hatte es vorher schon fast richtig
Ich hatte nur eine Kleinigkeit vergessen. Mein Chef hat mich nun drauf hingeweisen
Ich hatte es so |
Das hat aber nichts damit zu tun, dass Du bei real Ungenauigkeiten hast. Von daher ist wirklich die Verwendung von Currency oder die Umrechnung in Cent wichtig.
GiuStyler - Mi 17.09.14 16:26
Hi Nersgatt,
Laut Debugger, funktioniert es. Es wird richtig gerundet.
Habe aber nun ein anderes Problem mit meinem Programm.
Das programm ist ja ein Geldbetragumwandler, dass heißt, ich gebe einen Betrag an Beispiel 10,37 und das Programm errechnet mri die die niederigsten Münzenausgabe. Soweit so gut es klappt alles.
Nun habe ich ein Zusätzliches Fenster zu Beginn hinzugefügt, dass ich manuell selber Münzwerte definiere, sofern diese maximal 8 sind wie in Deutschland mit 8 Münzen.
Das sind die Standardwerte die immer gelten.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Münzwert[1] := 2.00; Münzwert[2] := 1.00; Münzwert[3] := 0.50; Münzwert[4] := 0.20; Münzwert[5] := 0.10; Münzwert[6] := 0.05; Münzwert[7] := 0.02; Münzwert[8] := 0.01; |
Im Zusatzfenster sind diese ebenso schon vordefiniert. Nun zum Problem.
Wie kann ich es nun machen, dass ich die eingegebenen Werte im anderen Programm für diese eine Sitzung intern speichere? Wie bekomme ich die selbstdefinierten Werte durch den OK klick rüber? Und welche Funktion muss ich ausführen, damit er dann die eingetragenen Werte auf auf der anderen Seite übergibt.
Die andere Seite heißt aHaupt und die class ist TFormGeldbetragumwandler
Hoffe man versteht was ich meine.
Edit:
Der Code sieht nun so aus und es klappt auch laut meinem Chef :-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Münzwert[1] := StrToFloat(bWerte.FormWerte.EditWert1.Text); Münzwert[2] := StrToFloat(bWerte.FormWerte.EditWert2.Text); Münzwert[3] := StrToFloat(bWerte.FormWerte.EditWert3.Text); Münzwert[4] := StrToFloat(bWerte.FormWerte.EditWert4.Text); Münzwert[5] := StrToFloat(bWerte.FormWerte.EditWert5.Text); Münzwert[6] := StrToFloat(bWerte.FormWerte.EditWert6.Text); Münzwert[7] := StrToFloat(bWerte.FormWerte.EditWert7.Text); Münzwert[8] := StrToFloat(bWerte.FormWerte.EditWert8.Text); |
Was nun noch fehlt ist das mit dem Ok. Wie kriege ich nun die Neuen Werte rüber?? Also welchen Befehl muss ich da eintragen?
Narses - Mi 17.09.14 23:38
Moin!
Bitte erstelle für deine neue Frage ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. :idea: Danke! ;)
cu
Narses
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!