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..8of 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

user profile iconGiuStyler hat folgendes geschrieben Zum zitierten Posting springen:

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