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,
    Matthias

    int 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 (statt 😎 5 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....


Anmelden zum Antworten