1. Dashboard
  2. Artikel
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. HTML - Webmaster Forum
  2. Programmierung - Entwickler Forum
  3. Forum für alle anderen Programmiersprachen

foat ist falsch

  • doctorjekyll
  • 23. August 2009 um 12:45
  • doctorjekyll
    Youngster
    Beiträge
    10
    • 23. August 2009 um 12:45
    • #1

    Mein Problem ist das der float einen falschen Wert hat.
    Der float ist dann z.B. 0.1000000001 anstatt einfach 0.1000000000.
    Was kann man da machen?

    Hier mein Code.

    Code
    #include <iostream>
    
    
    using namespace std;
    
    
    int main()
    {
        int wahl = 0;
        float preis = 0.0, einwurf1 = 0.0;
        cout << "Getraenkeautomat" << endl;
        cout << "Waehlen sie ihr Getraenk aus:" << endl;
        cout << "1. Wasser (0,50 Euro)" << endl;
        cout << "2. Limonade (1,00 Euro)" << endl;
        cout << "3. Bier (2,00 Euro)" << endl << endl;
        cout << "Bitte waehlen sie ein Getraenk aus: ";
        cin >> wahl;
        if (wahl == 1 || wahl == 2 || wahl == 3)
        {
            switch(wahl)
            {
                case 1:
                    preis = 0.50;
                    cout << "Sie haben 1. Wasser gewaehlt. Bitte zahlen sie (0,50 Euro)" << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }
                    else if (einwurf1 < preis)
                    {
                        float rest = preis - einwurf1;
                        float rueckgabe = 0.0;
                        do
                        {
                            float einwurf2 = 0.0;
                            cout << "Es fehlen: " << rest << endl;
                            cout << "Einwurf: ";
                            cin >> einwurf2;
                            rueckgabe = einwurf1 + einwurf2;
                            rest -= einwurf2;
                            einwurf1 = 0.0;
                        }while (rest > 0.00);
                        if (rueckgabe == preis)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        }else if (rueckgabe > preis)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                            cout << "Ihr Wechselgeld betraegt: " << rueckgabe - preis;
                        }
                        //cout << "Es fehlen: " << preis - einwurf1 << endl;
                        //cout << "Schade versuchen sie es wenn sie genug Geld haben";
                        break;
                    }
                    else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
                case 2:
                    preis = 1.00;
                    cout << "Sie haben 2. Limonade gewaehlt. Bitte zahlen sie (1,00 Euro)" << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }
                    else if (einwurf1 < preis)
                    {
                        cout << "Es fehlen: " << preis - einwurf1 << endl;
                        cout << "Schade versuchen sie es wenn sie genug Geld haben";
                        break;
                    }
                    else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
                case 3:
                    preis = 2.00;
                    cout << "Sie haben 3. Bier gewaehlt. Bitte zahlen sie (2,00 Euro)" << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }
                    else if (einwurf1 < preis)
                    {
                        cout << "Es fehlen: " << preis - einwurf1 << endl;
                        cout << "Schade versuchen sie es wenn sie genug Geld haben";
                        break;
                    }
                    else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
            }
        } else { cout << "Falsche Eingabe!";}
        getchar();
        getchar();
    return 0;
    }
    Alles anzeigen
  • doctorjekyll
    Youngster
    Beiträge
    10
    • 23. August 2009 um 15:37
    • #2

    Hier noch eben fix überarbeitet.

    Code
    #include <iostream>
    
    
    using namespace std;
    
    
    int main()
    {
        int wahl = 0;
        float preis = 0.0, einwurf1 = 0.0;
        cout << "Getraenkeautomat" << endl << endl;
        cout << "1. Wasser (0,50 Euro)" << endl;
        cout << "2. Limonade (1,00 Euro)" << endl;
        cout << "3. Bier (2,00 Euro)" << endl << endl;
        cout << "Bitte waehlen sie ein Getraenk aus: ";
        cin >> wahl;
        cout << endl;
        if (wahl == 1 || wahl == 2 || wahl == 3)
        {
            switch(wahl)
            {
                case 1:
                    preis = 0.50;
                    cout << "Sie haben 1. Wasser gewaehlt. Bitte zahlen sie (0,50 Euro)" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preis)
                    {
                        float rest = preis - einwurf1;
                        float rueckgabe = 0.0;
                        do
                        {
                            float einwurf2 = 0.0;
                            cout << "Es fehlen: " << rest << " Euro" << endl << endl;
                            cout << "Einwurf: ";
                            cin >> einwurf2;
                            cout << endl;
                            rueckgabe = einwurf1 + einwurf2;
                            rest -= einwurf2;
                            einwurf1 = 0.0;
                        }while (rest > 0.00); //(rueckgabe != preis || rueckgabe > preis);
                        if (rueckgabe == preis)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        }else if (rueckgabe > preis)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                            cout << "Ihr Wechselgeld betraegt: " << rueckgabe - preis << " Euro";
                        }
                        break;
                    }else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
                case 2:
                    preis = 1.00;
                    cout << "Sie haben 2. Limonade gewaehlt. Bitte zahlen sie (1,00 Euro)" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preis)
                    {
                        cout << "Es fehlen: " << preis - einwurf1 << endl;
                        cout << "Schade versuchen sie es wenn sie genug Geld haben";
                        break;
                    }else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
                case 3:
                    preis = 2.00;
                    cout << "Sie haben 3. Bier gewaehlt. Bitte zahlen sie (2,00 Euro)" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preis)
                    {
                        cout << "Es fehlen: " << preis - einwurf1 << endl;
                        cout << "Schade versuchen sie es wenn sie genug Geld haben";
                        break;
                    }else if (einwurf1 > preis)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preis << " Euro" << endl;
                        break;
                    }
            }
        }else { cout << "Falsche Eingabe!";}
        getchar();
        getchar();
    return 0;
    }
    Alles anzeigen

    Ich habe eingegeben: 0.3

    doch die variable hat dann den Wert:
    einwurf1 0.30000001 float

  • The User
    Forum Guru
    Beiträge
    4.044
    • 23. August 2009 um 22:44
    • #3

    Richtig exakt geht es nicht.
    Variante 1:

    Code
    cout.precision(6);
    cout << 0.3f << endl;

    Variante 2: double benutzen, wenn du mehr Genauigkeit brauchst.

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • doctorjekyll
    Youngster
    Beiträge
    10
    • 23. August 2009 um 23:37
    • #4

    Ah ok danke für die schnelle Antwort.
    Hab das jetzt etwas anders gelöst.

    Mein fertiges Programm.

    C
    #include <iostream>
    #include <cmath> 
    
    
    using namespace std;
    
    
    const float preiswasser = 0.5;
    const float preislimonade = 1.0;
    const float preisbier = 2.0;
    
    
    double round(double value, int precision)
    {
        double multiplier(pow(10.0, precision));
        return floor(value * multiplier  + 0.5) / multiplier;
    }
    
    
    int main()
    {
        int wahl = 0;
        float einwurf1 = 0;
        cout << "Getraenkeautomat" << endl << endl;
        cout << "1. Wasser " << preiswasser << " Euro" << endl;
        cout << "2. Limonade " << preislimonade << " Euro" << endl;
        cout << "3. Bier " << preisbier << " Euro" << endl << endl;
        cout << "Bitte waehlen sie ein Getraenk aus: ";
        cin >> wahl;
        cout << endl;
        if (wahl == 1 || wahl == 2 || wahl == 3)
        {
            switch(wahl)
            {
                case 1:
                    cout << "Sie haben 1. Wasser gewaehlt. Bitte zahlen sie " << preiswasser << " Euro" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preiswasser)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preiswasser)
                    {
                        float rest = preiswasser - einwurf1;
                        float rueckgabe = 0;
                        do
                        {
                            float einwurf2 = 0;
                            cout << "Es fehlen: " << rest << " Euro" << endl << endl;
                            cout << "Einwurf: ";
                            cin >> einwurf2;
                            cout << endl;
                            rueckgabe += (einwurf1 + einwurf2);
                            rest = round(rest - einwurf2, 2);
                            einwurf1 = 0;
                        }while (rest > 0);
                        if (rueckgabe == preiswasser)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        }else if (rueckgabe > preiswasser)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                            cout << "Ihr Wechselgeld betraegt: " << rueckgabe - preiswasser << " Euro";
                        }
                        break;
                    }else if (einwurf1 > preiswasser)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preiswasser << " Euro" << endl;
                        break;
                    }
                case 2:
                    cout << "Sie haben 2. Limonade gewaehlt. Bitte zahlen sie " << preislimonade << " Euro" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preislimonade)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preislimonade)
                    {
                        float rest = preislimonade - einwurf1;
                        float rueckgabe = 0;
                        do
                        {
                            float einwurf2 = 0;
                            cout << "Es fehlen: " << rest << " Euro" << endl << endl;
                            cout << "Einwurf: ";
                            cin >> einwurf2;
                            cout << endl;
                            rueckgabe += (einwurf1 + einwurf2);
                            rest = round(rest - einwurf2, 2);
                            einwurf1 = 0;
                        }while (rest > 0);
                        if (rueckgabe == preislimonade)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        }else if (rueckgabe > preislimonade)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                            cout << "Ihr Wechselgeld betraegt: " << rueckgabe - preislimonade << " Euro";
                        }
                        break;
                    }else if (einwurf1 > preislimonade)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preislimonade << " Euro" << endl;
                        break;
                    }
                case 3:
                    cout << "Sie haben 3. Bier gewaehlt. Bitte zahlen sie " << preisbier << " Euro)" << endl << endl;
                    cout << "Einwurf: ";
                    cin >> einwurf1;
                    cout << endl;
                    if (einwurf1 == preisbier)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        break;
                    }else if (einwurf1 < preisbier)
                    {
                        float rest = preisbier - einwurf1;
                        float rueckgabe = 0;
                        do
                        {
                            float einwurf2 = 0;
                            cout << "Es fehlen: " << rest << " Euro" << endl << endl;
                            cout << "Einwurf: ";
                            cin >> einwurf2;
                            cout << endl;
                            rueckgabe += (einwurf1 + einwurf2);
                            rest = round(rest - einwurf2, 2);
                            einwurf1 = 0;
                        }while (rest > 0);
                        if (rueckgabe == preisbier)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!";
                        }else if (rueckgabe > preisbier)
                        {
                            cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                            cout << "Ihr Wechselgeld betraegt: " << rueckgabe - preisbier << " Euro";
                        }
                        break;
                    }else if (einwurf1 > preisbier)
                    {
                        cout << "Danke. Bitte entnehmen sie ihr Getraenk!" << endl;
                        cout << "Ihr Wechselgeld betraegt: " << einwurf1 - preisbier << " Euro" << endl;
                        break;
                    }
            }
        }else { cout << "Falsche Eingabe!";}
        getchar();
        getchar();
    return 0;
    }
    Alles anzeigen
  • The User
    Forum Guru
    Beiträge
    4.044
    • 24. August 2009 um 21:10
    • #5

    Das ist keine gute Lösung. Du solltest lieber das Ausgabeformat per cout.precision steuern, anstatt manuell umzurechnen, da es ja nur um die Ausgabe geht.

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

  • doctorjekyll
    Youngster
    Beiträge
    10
    • 25. August 2009 um 00:50
    • #6

    Hmm irgendwie geht das nicht.
    Wenn ich immer 0.1 eingebe ist

    rest = -1.4901161e-008 und nicht rest = 0

    wie vorher auch.

    PS: Mir gefällt die Lösung ja auch nicht.

    Einmal editiert, zuletzt von doctorjekyll (25. August 2009 um 00:58)

  • The User
    Forum Guru
    Beiträge
    4.044
    • 27. August 2009 um 15:23
    • #7

    Du machst cout.precision(6), und dann wird dir dir nicht mehr diesen Rest anzeigen.
    Ansonsten evtl. long double nehmen.

    Freiheit bedeutet mehr.

    "Mir ist die gefährliche Freiheit lieber als eine ruhige Knechtschaft."
    (Jean Jacques Rousseau)
    Mein Blog zum Programmieren, GNU/Linux etc.
    Free Chelsea Manning!
    Stolzer Nutzer von KDE, openSUSE und Qt.

Tags

  • anzeige
  • programm
  • problem
  • code
  • wasser
  • steuer
  • steuern
  • rest
  • lösung
  • eingabe
  • include
  • exakt
  • variable
  • float
  • int
  • switch
  • long
  • genauigkeit
  • double
  • falscher wert
  • foat
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
Zitat speichern