Forum: PC-Programmierung C-Programmieren Rundungsfehler


von Alex (Gast)


Lesenswert?

Hallo,

ich fange gerade mit dem Programmieren an und versuche gerade einen 
Getränkeautomaten zu programmieren, der auch Wechselgeld geben kann. Nun 
tritt das folgende Problem auf:

Wenn ich erst 1.30 einwerfe und danach 0.20 dann gibt mir der Editor 
aus: "Bitte werfen Sie noch 0.00 EUR ein." Hat jemand einen Tipp wie ich 
dieses Problem lösen kann?

int cola () {
float cola;
float einwurf;

cola=1.5;
  if (einwurf<cola) {
  do {
  printf("\nBitte werfen Sie %0.2f Euro ein\n\n", cola);
  scanf("%f", &einwurf);
  cola = cola + einwurf;}
  while (cola>0);}
  if (cola<0) printf("\nBitte entnehmen Sie die Cola und das   Rueckgeld 
von %0.2f EUR\n\n", -cola);
  if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n");

  return 0;
}

Danke schonmal für eure Hilfe!

von Chris L. (kingkernel)


Lesenswert?

Das Problem wirst du bei Float immer haben und manuell lösen müssen. Gib 
die Werte als iInteger an und rechne in Cent statt in Euro!

von Peter II (Gast)


Lesenswert?

Alex schrieb:
> Hat jemand einen Tipp wie ich
> dieses Problem lösen kann?

ja.

1. Rechnen in Cent - dann gibt es keine Rundungsprobleme
2. float kann man nicht sinnvoll auf "gleich" vergleichen. Es gibt nur 
größer und kleiner.

von Mike (Gast)


Lesenswert?

was sind denn deine Eingaben für scanf, die du im Einwurf speicherst? 
-1,3 und -0.2? dann ist klar, warum (einwurf<cola) stets erfüllt ist.

von awsxdde (Gast)


Lesenswert?

Alex schrieb:
> cola = cola + einwurf;

Wieso wird die Cola immer teurer, je mehr Geld eingeworfen wird?

awsxdde

von Bastler (Gast)


Lesenswert?

Wo wird float einwurf initialisiert und wo wird float einwurf der 
aktuelle Wert uebergeben?

von Mike (Gast)


Lesenswert?

Mike schrieb:
> was sind denn deine Eingaben für scanf, die du im Einwurf speicherst?
> -1,3 und -0.2? dann ist klar, warum (einwurf<cola) stets erfüllt ist.

erst denken, dann posten. Sry.

von Alex (Gast)


Lesenswert?

Erstmal vielen Danke für eure schnellen Antworten!

Sorry wegen des Fehlers in der Zeile:
> cola = cola + einwurf;

Da hatte ich etwas rumgespielt und vergessen das + durch ein - zu 
ersetzen.

Ich werde nun versuchen das Problem durch Integer zu lösen.

von Alex (Gast)


Lesenswert?

Das Problem wurde von einem Kollege gerade wie folgt umgangen XD:

int cola () {
float cola;
float einwurf;

cola=1.5;
if (einwurf<cola) {
do {
printf("\nBitte werfen Sie %0.2f Euro ein\n\n", cola);
scanf("%f", &einwurf);
cola = cola - einwurf;}
while (cola>0.005);}
if (cola<-0.005) printf("\nBitte entnehmen Sie die Cola und das 
Rueckgeld von %0.2f EUR\n\n", -cola);
if (cola>=-0.005) printf("\nBitte entnehmen Sie die Cola.\n\n");

return 0;
}

Grüße

von m.n. (Gast)


Lesenswert?

Du kannst schon bei float bleiben,

...
  cola = cola - einwurf;
} while (cola >= 0.005);

darfst aber nicht auf exakt 0.0 vergleichen.
Alex schrieb:
> if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n");

Entweder >= oder <= verwenden.

von Peter II (Gast)


Lesenswert?

Alex schrieb:
> Das Problem wurde von einem Kollege gerade wie folgt umgangen XD:

schön ist das aber nicht.
1
while (cola>0.005);

der wert kann auch negativ sein. Dann sollte man es wenigsten so machen:
1
while (abs(Cola)<0.005)) {

von awsxdde (Gast)


Lesenswert?

m.n. schrieb:
> Du kannst schon bei float bleiben,
>
> ...
>   cola = cola - einwurf;
> } while (cola >= 0.005);
>
> darfst aber nicht auf exakt 0.0 vergleichen.
> Alex schrieb:
>> if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n");
>
> Entweder >= oder <= verwenden.

Naja, nicht wirklich.
Wenn herauskommt, dass noch 0.000004 einzuwerfen sind, reicht es eben 
immer noch nicht.

awsxdde

von m.n. (Gast)


Lesenswert?

awsxdde schrieb:
>> Entweder >= oder <= verwenden.
>
> Naja, nicht wirklich.

Das war ein allgemeiner Rat und nicht auf die spezielle Rundung bezogen, 
wie ich es zuvor gezeigt hatte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.