<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[c++ Berechnung funktioniert nicht richtig (falsches ergebnis)]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Vorweg möchte ich sagen, das ich weis, das ich das ganze anders machen sollte, wie z.B. anstatt getch() - cin.get() oder anstatt if else - switch case verwenden sollte usw..</p>
<p>Aber bevor ich das ganze anpasse. Will ich erstmal den fehler wegbekommen, der da drin ist. Zudem gitb die Aufgabenstellung vor, das nur das Hauptmenu in int main() sein soll, alles andere soll in der funktion zahlvorgang() drin sein.</p>
<p>das Hauptmenu und alle eingaben funktionieren. aber in der Funktion zahlvorgang()<br />
ergibt &quot;zurueck=bezahlt-betrag&quot; nicht 0, wenn ich im Hauptmenu den Kaffee oder Kakao auswähle und dann 7mal bzw. 8 mal &quot;z&quot; drücke.<br />
Eigendlich müsste beim kaffee (&quot;bezahlt-betrag&quot; -&gt; &quot;0.7-0.7&quot;) 0 ergeben. es kommt aber 5.96046e-006 raus. Beim &quot;Zitronentee&quot; also 6 mal die &quot;z&quot; druecken kommt das richtige ergebniss raus.</p>
<p>Lasse ich am Ende bezahlt und betrag ausgeben, steht auch 0.7 beim kaffee.<br />
Was aber komisch ist, wähle ich Kaffee und bezahle einmal 50 Cent und dann 20 Cent also taste &quot;w&quot; und &quot;f&quot; dann kommt 0 raus.</p>
<p>Ich hoffe mein Problem wurde gut genug geschildert.</p>
<p>Hier noch mein quellcode:<br />
main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;conio.h&gt;

void zahlvorgang(float betrag);

using namespace std;

int main()
{
    int pressed=0;
    int auswahl;
    float betrag=0;
    do
    {     
    cout &lt;&lt; &quot;[1]  Kaffee       0.70 Euro\n&quot;
            &quot;[2]  Kakao        0.80 Euro\n&quot; 
            &quot;[3]  Zitronentee  0.60 Euro\n&quot;
            &quot;    Bitte waehlen Sie ...\n&quot;;
    pressed = getch();
    if(pressed==27)
    {
        auswahl=false;
    }
    else
    {
        if(pressed==49)
        {
            betrag=0.7;
            auswahl=true;
        }
        else
        {
            if(pressed==50)
            {
                betrag=0.8;
                auswahl=true;                
            }
            else
            {
                if(pressed==51)
                {
                    betrag=0.6;
                    auswahl=true;
                }
                else
                {
                    cout &lt;&lt; &quot;\nfalsche Taste!!!\n\n&quot;;
                    auswahl=false;
                }
            }
        }
    }
    if(auswahl==true)
    {
    zahlvorgang(betrag);
    pressed=48;
    }
    }while(pressed!=27);
    return 0;
}

void zahlvorgang(float betrag)
{
    float zahlung=0, bezahlt=0, nbezahlt=betrag, zurueck=0;
    int pressed;
    cout &lt;&lt; &quot;Wieviel moechten Sie einwerfen?\n&quot;
            &quot;z =     10 Cent\n&quot; 
            &quot;w =     20 Cent\n&quot;
            &quot;f =     50 Cent\n&quot; 
            &quot;1 =     1 Euro\n&quot;
            &quot;2 =     2 Euro\n&quot;;
    do
    {
         pressed=getch();;
         if(pressed==122)
         {
             zahlung=0.1;
         }
         else
         {
             if(pressed==119)
             {
                 zahlung=0.2;
             }
             else
             {
                 if(pressed==102)
                 {
                     zahlung=0.5;
                 }
                 else
                 {
                     if(pressed==49)
                     {
                         zahlung=1;
                     }
                     else
                     {
                         if(pressed==50)
                         {
                             zahlung=2;
                         }
                         else
                         {
                             zahlung=0;
                         }
                     }        
                 }                
             }
         }
         bezahlt=bezahlt+zahlung;
         nbezahlt=betrag-bezahlt;
         if(bezahlt&lt;betrag)
         {
         cout &lt;&lt; &quot;Sie haben bisher bezahlt :   &quot; &lt;&lt; bezahlt &lt;&lt; &quot; Euro \n&quot;
                 &quot;Sie haben noch zu bezahlen : &quot; &lt;&lt; nbezahlt &lt;&lt; &quot; Euro \n&quot;
                 &quot;Bitte werfen Sie eine Muenze in den Automaten !\n&quot;;
         }
    }while(bezahlt&lt;betrag);
    cout &lt;&lt; &quot;------------------------------------------------\n&quot;;
    zurueck=bezahlt-betrag;
    if(zurueck==0)
    {
        cout &lt;&lt; &quot;Sie erhalten nichts zurueck.\n&quot; 
                &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;
    }
    else
    {
        if(zurueck&lt;1)
        {
            zurueck=zurueck*100;
            cout &lt;&lt; &quot;Sie erhalten &quot; &lt;&lt; zurueck &lt;&lt; &quot; Cent zurueck.\n&quot; 
                    &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;
        }
        else
        {
            cout &lt;&lt; &quot;Sie erhalten &quot; &lt;&lt; zurueck &lt;&lt; &quot; Euro zurueck.\n&quot; 
                    &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;            
        }     
    }
    getch();
}
</code></pre>
<p>Ich verwende Dev-c++ 4.9.9.2 mit dem mitgelieferten Mingw compiler</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245171/c-berechnung-funktioniert-nicht-richtig-falsches-ergebnis</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:36:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245171.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jul 2009 14:29:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to c++ Berechnung funktioniert nicht richtig (falsches ergebnis) on Fri, 10 Jul 2009 14:29:44 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Vorweg möchte ich sagen, das ich weis, das ich das ganze anders machen sollte, wie z.B. anstatt getch() - cin.get() oder anstatt if else - switch case verwenden sollte usw..</p>
<p>Aber bevor ich das ganze anpasse. Will ich erstmal den fehler wegbekommen, der da drin ist. Zudem gitb die Aufgabenstellung vor, das nur das Hauptmenu in int main() sein soll, alles andere soll in der funktion zahlvorgang() drin sein.</p>
<p>das Hauptmenu und alle eingaben funktionieren. aber in der Funktion zahlvorgang()<br />
ergibt &quot;zurueck=bezahlt-betrag&quot; nicht 0, wenn ich im Hauptmenu den Kaffee oder Kakao auswähle und dann 7mal bzw. 8 mal &quot;z&quot; drücke.<br />
Eigendlich müsste beim kaffee (&quot;bezahlt-betrag&quot; -&gt; &quot;0.7-0.7&quot;) 0 ergeben. es kommt aber 5.96046e-006 raus. Beim &quot;Zitronentee&quot; also 6 mal die &quot;z&quot; druecken kommt das richtige ergebniss raus.</p>
<p>Lasse ich am Ende bezahlt und betrag ausgeben, steht auch 0.7 beim kaffee.<br />
Was aber komisch ist, wähle ich Kaffee und bezahle einmal 50 Cent und dann 20 Cent also taste &quot;w&quot; und &quot;f&quot; dann kommt 0 raus.</p>
<p>Ich hoffe mein Problem wurde gut genug geschildert.</p>
<p>Hier noch mein quellcode:<br />
main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;conio.h&gt;

void zahlvorgang(float betrag);

using namespace std;

int main()
{
    int pressed=0;
    int auswahl;
    float betrag=0;
    do
    {     
    cout &lt;&lt; &quot;[1]  Kaffee       0.70 Euro\n&quot;
            &quot;[2]  Kakao        0.80 Euro\n&quot; 
            &quot;[3]  Zitronentee  0.60 Euro\n&quot;
            &quot;    Bitte waehlen Sie ...\n&quot;;
    pressed = getch();
    if(pressed==27)
    {
        auswahl=false;
    }
    else
    {
        if(pressed==49)
        {
            betrag=0.7;
            auswahl=true;
        }
        else
        {
            if(pressed==50)
            {
                betrag=0.8;
                auswahl=true;                
            }
            else
            {
                if(pressed==51)
                {
                    betrag=0.6;
                    auswahl=true;
                }
                else
                {
                    cout &lt;&lt; &quot;\nfalsche Taste!!!\n\n&quot;;
                    auswahl=false;
                }
            }
        }
    }
    if(auswahl==true)
    {
    zahlvorgang(betrag);
    pressed=48;
    }
    }while(pressed!=27);
    return 0;
}

void zahlvorgang(float betrag)
{
    float zahlung=0, bezahlt=0, nbezahlt=betrag, zurueck=0;
    int pressed;
    cout &lt;&lt; &quot;Wieviel moechten Sie einwerfen?\n&quot;
            &quot;z =     10 Cent\n&quot; 
            &quot;w =     20 Cent\n&quot;
            &quot;f =     50 Cent\n&quot; 
            &quot;1 =     1 Euro\n&quot;
            &quot;2 =     2 Euro\n&quot;;
    do
    {
         pressed=getch();;
         if(pressed==122)
         {
             zahlung=0.1;
         }
         else
         {
             if(pressed==119)
             {
                 zahlung=0.2;
             }
             else
             {
                 if(pressed==102)
                 {
                     zahlung=0.5;
                 }
                 else
                 {
                     if(pressed==49)
                     {
                         zahlung=1;
                     }
                     else
                     {
                         if(pressed==50)
                         {
                             zahlung=2;
                         }
                         else
                         {
                             zahlung=0;
                         }
                     }        
                 }                
             }
         }
         bezahlt=bezahlt+zahlung;
         nbezahlt=betrag-bezahlt;
         if(bezahlt&lt;betrag)
         {
         cout &lt;&lt; &quot;Sie haben bisher bezahlt :   &quot; &lt;&lt; bezahlt &lt;&lt; &quot; Euro \n&quot;
                 &quot;Sie haben noch zu bezahlen : &quot; &lt;&lt; nbezahlt &lt;&lt; &quot; Euro \n&quot;
                 &quot;Bitte werfen Sie eine Muenze in den Automaten !\n&quot;;
         }
    }while(bezahlt&lt;betrag);
    cout &lt;&lt; &quot;------------------------------------------------\n&quot;;
    zurueck=bezahlt-betrag;
    if(zurueck==0)
    {
        cout &lt;&lt; &quot;Sie erhalten nichts zurueck.\n&quot; 
                &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;
    }
    else
    {
        if(zurueck&lt;1)
        {
            zurueck=zurueck*100;
            cout &lt;&lt; &quot;Sie erhalten &quot; &lt;&lt; zurueck &lt;&lt; &quot; Cent zurueck.\n&quot; 
                    &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;
        }
        else
        {
            cout &lt;&lt; &quot;Sie erhalten &quot; &lt;&lt; zurueck &lt;&lt; &quot; Euro zurueck.\n&quot; 
                    &quot;Bitte nehmen Sie Ihr Getraenk aus dem Automaten.\n&quot;;            
        }     
    }
    getch();
}
</code></pre>
<p>Ich verwende Dev-c++ 4.9.9.2 mit dem mitgelieferten Mingw compiler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740456</guid><dc:creator><![CDATA[Thelo]]></dc:creator><pubDate>Fri, 10 Jul 2009 14:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to c++ Berechnung funktioniert nicht richtig (falsches ergebnis) on Fri, 10 Jul 2009 14:49:59 GMT]]></title><description><![CDATA[<p>Rechne mit Integer-Werten (Cent) statt Float-Werten (Euro), dann hast Du keine Probleme mit der Dir nicht vertrauten Float-Arithmetik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740473</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Fri, 10 Jul 2009 14:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to c++ Berechnung funktioniert nicht richtig (falsches ergebnis) on Fri, 10 Jul 2009 14:50:40 GMT]]></title><description><![CDATA[<p>Verändere in Zeile 122 die Abfrage nach</p>
<pre><code class="language-cpp">if(zurueck&lt;=0.005)
</code></pre>
<p>Das hat damit zu tun, dass ein Rechner, der intern binär arbeitet, z.B. die Zahl 0,1 nicht exakt darstellen kann. Wir hatten vor kurzem einen <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1735448.html" rel="nofollow">Thread zum Thema</a>.<br />
Beispiel:</p>
<pre><code class="language-cpp">float betrag = 1.;
    for( int i=0; i&lt;10; ++i )
        betrag -= 0.1;
    if( betrag != 0.0 ) 
        cout &lt;&lt; &quot;betrag = &quot; &lt;&lt; betrag &lt;&lt; endl;
</code></pre>
<p>.. das wird nie wieder ==0.0 - auch nicht wenn Du double benutzt.</p>
<p>In Deinem Fall ist es wohl am einfachsten, Du stellst intern auf Euro-Cent und den Datentyp int um. Ansonsten musst Du bei jedem Vergleich zweier Beträge die Rechenungenauigkeit einkalkulieren.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740475</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 10 Jul 2009 14:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to c++ Berechnung funktioniert nicht richtig (falsches ergebnis) on Fri, 10 Jul 2009 15:22:02 GMT]]></title><description><![CDATA[<p>Vielen dank, funktioniert. Was mir irgendwie nich einleuchtet, warum 0.7-0.7 nicht exakt 0 ergibt ^^. Naja mit der zeit werde ich das auch begreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740491</guid><dc:creator><![CDATA[Thelo]]></dc:creator><pubDate>Fri, 10 Jul 2009 15:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to c++ Berechnung funktioniert nicht richtig (falsches ergebnis) on Fri, 10 Jul 2009 15:35:19 GMT]]></title><description><![CDATA[<p>Thelo schrieb:</p>
<blockquote>
<p>Vielen dank, funktioniert. Was mir irgendwie nich einleuchtet, warum 0.7-0.7 nicht exakt 0 ergibt ^^. Naja mit der zeit werde ich das auch begreifen.</p>
</blockquote>
<p>Nun - weil 0,7-0,7 wirklich exakt 0 ist; in Deinem Programm aber 0,7-0,1-0,1-0,1-0,1-0,1-0,1-0,1 gerechnet wird; und das ist aus dem selben Grund nicht exakt 0, weil</p>
<pre><code>0,5 - 1/6 - 1/6 - 1/6 = 0,5 - 0,1666667 - 0,1666667 - 0,1666667 = -0,0000001
</code></pre>
<p>auch nicht exakt 0 ist.</p>
<p>Die Zahl 0,1 ist in Binärdarstellung %0,0(0011) - die () stehen für die Periode - z.B. 1/6 = 0,1(6) im Dezimalsystem</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740499</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 10 Jul 2009 15:35:19 GMT</pubDate></item></channel></rss>