Ist dieser Bug von mir oder vom C++ Builder?
-
Hi,
ich werd noch bekloppt: ist das jetzt mein Fehler oder habe ich einen Bug im C++Builder (Version 4.0 Enterprise mit beiden Servicepacks) gefunden?
Mein Code soll einen beliebigen Geldbetrag in 2 Euro, 50 Cents und 5 Cent Münzen zerlegen. Wenn ich jedoch 15 cent vorgebe, dann kommt als Ergebnis 2 mal 5 cent heraus, statt 3 mal! Im Debugger wird noch alles richtig angezeigt (auf der rechten Seite, aber nach der Zuweisung steht eine 2 in der Variable i5Cent.
Bitte sagt mir doch, was ich falsch mache!!!Vielen Dank,
Matthiasint i2Euro; int i50Cent; int i5Cent; double dCellContent = 0.15; i2Euro = (int)(dCellContent / 2.0); i50Cent = (int)((dCellContent - 2.0 * i2Euro) / 0.50); i5Cent = (int)((dCellContent - 2.0 * i2Euro - 0.50 * i50Cent) / 0.05);
-
int i2Euro; int i50Cent; int i5Cent; int dCellContent = 15; i2Euro = (int)(dCellContent / 200); i50Cent = (int)((dCellContent - 200 * i2Euro) / 50); i5Cent = (int)((dCellContent - 200 * i2Euro - 50 * i50Cent) / 5);
0.15 / 0.05 =2.99999999999... !!!
Editiert: Die Casts koennen auch noch weg!(Stoeren aber nicht)[ Dieser Beitrag wurde am 03.07.2003 um 22:12 Uhr von DerAltenburger editiert. ]
-
Du darfst nicht casten nach int !!! Dein i2Euro ist z.B. 0 statt 0.075 !
Gruß WoWe
-
Danke Leute,
es funktioniert, wenn ich es so mache, wie der Altenburger.
Ich dachte aber immer, dass, wenn ich eine float (bzw. double) Variable auf einen Integer zuweise, immer die vor dem Komma stehende Zahl genommen wird und der Rest unter den Tisch fällt. Quasi immer auf die 1er abgerundet wird. Ist das denn nicht so??? Ich glaub ich muss mal richtig C lernen. Aber was für ein Buch erklärt einem denn sooo Sachen???MfG Matthias
-
wäre hier nicht nen anderer lösungsweg angebrachter?
// zu prüfender betrag double betrag = 0.15; // betrag in integer form damit keine nachkommastellen dabei sin int ibetrag = betrag * 100; int Tmp = ibetrag; // jeweilige anzahl der münzen int Euro2 = 0; int Cent50 = 0; int Cent5 = 0; // münzen zählen while (Tmp >= 200) { Tmp -= 200; Euro2++; } while (Tmp >= 50) { Tmp -= 50; Cent50++; } while (Tmp > 0) { Tmp -= 5; Cent5++; } ShowMessage(IntToStr(Euro2) + " " + IntToStr(Cent50) + " " + IntToStr(Cent5));
-
Original erstellt von <Matthias>:
**... immer die vor dem Komma stehende Zahl genommen wird und der Rest unter den Tisch fällt.MfG Matthias**
Genau das macht der ja!!!
0.15 / 0.05 =2.99999????... !!! => 2!!!!
-
Also jetzt raff ich gar nichts mehr!
Erstmal @Altenburger: Deine Version habe ich noch nicht getestet, dürfte aber sicher laufen. Trotzdem: nachdem mit dem "mal 100" alles zu klappen schien, (die 0,15 cent waren tatsächlich drei 5-cent Stücke) gabs bei 18,90 Euro dasselbe Problem: er rechnet aus, dass 7 (statt5 cent Stücke benötigt werden.
GRAAAA! Und wieso ist 0.15 / 0.05 nicht 3 sondern 2.99999999?Ich versteh die Welt nicht mehr!
int i2Euro; int i50Cent; int i5Cent; double dCellContent = 18.90; dCellContent *= 100; i2Euro = (dCellContent / 200); i50Cent = ((dCellContent - 200 * i2Euro) / 50); i5Cent = ((dCellContent - 200 * i2Euro - 50 * i50Cent) / 5);
-
Ähh, hab mich grad vertippt: es soll nicht heißen "dass 7 (statt
5 cent Stücke benötigt werden." sondern:
dass 3 (statt 4) 5 cent Stücke benötigt werden. (kommt aber aufs selbe raus).
Ausserdem ist mir aufgefallen:double dCellContent = 18.9;
int iTemp;iTemp = dCellContent * 100;
dann hat iTemp nicht etwa 1890 sondern 1889! Warum????
-
Nimm nicht Dezimalzahlen!!!
Da sin Rundungsfehler in den hinteren Nachkommastellen!!!
Werte sind zu gross/oder zu klein!
Bei Cast zu INT wird ABGERUNDET!
Machs wie ich angegeben hab nur mit Ganzzahl = CENT!
PS: 0.15 (und andere Werte) kann intern als dez. nicht exakt abgebildet werden!
[ Dieser Beitrag wurde am 03.07.2003 um 22:59 Uhr von DerAltenburger editiert. ]
-
Sorry, ich bin so chaotisch, das mit dem "7 (statt 8)" stimmte doch, und: wenn ich bei der Zuweisung:
iTemp = dCellContent * 100;
einfach 0.5 addiere
iTemp = dCellContent * 100 + 0.5;
dann scheint alles einwandfrei zu laufen. Aber ich merk schon, keine Aufgabe ist so primitiv, dass ich sie nicht total verpfuschen könnte. Schnieeef....