Anfänger Problem
-
Hi Community!
Ich bin sowohl neu hier, also auch neu bei C/C++. Für eine Prüfung (bin Student) schreibe ich ein Programm das u.a. folgendes machen soll:
Ich werde aufgefordert einen Geldbetrag einzugeben (im Format xx.xx, also float).
Darauf erfolgt die Ausgabe getrennt in Euro und Cent.
Beispiel:Geben Sie den Betrag ein:
12.20Sie haben 12 Euro und 20 Cent eingegeben.
Nun habe ich eine Funktion geschrieben, die das ganze erledigen soll. Das tut sie soweit auch ganz gut. Jedoch habe ich immer mal wieder 1 oder 2 Cent Differenz in der Antwort. Es scheint mit den bekannten float-Rundungsfehler zusammen zu hängen, oder?
Beispiel:Geben Sie den Betrag ein:
12.23Sie haben 12 Euro und 22 Cent eingegeben.
Vielleicht habt ihr einen Tipp für mich, wie ich das besser lösen kann?
Ich wäre sehr dankbar, in ein paar Tagen muß ich das Programm abgeben... (Das ist allerdings nur ein Bruchteil des Programms, den Rest habe ich schon fertig
Gruß,
Speedriff#include <iostream> using namespace std; // Variablen float fEingabe = 0; int iEingabe = 0; // Definition der Funktionen void Euro_und_Cent(int iBetrag) { cout << (iBetrag / 100) << " Euro und " << int(100 * ((float(iBetrag) / 100) - int(iBetrag / 100))) << " Cent"; } // Hauptprogramm main(){ cout << "Betrag eingeben: " << endl; cin >> fEingabe; iEingabe = fEingabe * 100; cout << "Ihre Eingabe entspricht "; Euro_und_Cent(iEingabe); cout << endl; system("pause"); }
-
Speedriff schrieb:
(im Format xx.xx, also float).
Nein, der Datentyp float folgt nicht aus der Schreibweise. Ähnlichkeit/Gleichheit in der Schreibweise bedingt nicht unbedingt Ähnlichkeit/Gleichheit in der logischen Bedeutung. Du würdest ja auch (hoffentlich) keine Postleitzahlen als Integer verarbeiten, bloß weil sie (in manchen Schreibweisen) aussehen wie Ganzzahlen.
Geld ist eine diskrete Größe. Fließkommazahlen sind das Gegenteil (zumindest so gut wie das in einem Computer eben geht). Das heißt, hier wäre eher ein Datentyp für diskrete Werte angebracht, zum Beispiel ein Integer. Dann rechnest du eben in der Einheit von (ganzen) Cents.
-
SeppJ schrieb:
Du würdest ja auch (hoffentlich) keine Postleitzahlen als Integer verarbeiten, bloß weil sie (in manchen Schreibweisen) aussehen wie Ganzzahlen.
Nun ja, ehrlich gesagt hätte ich für Postleitzahlen sehr wohl Integer benutzt. Das scheint mit meinem jetzigen Anfängerwissen eine gute Idee ?!
Sepp3 schrieb:
Geld ist eine diskrete Größe. Fließkommazahlen sind das Gegenteil (zumindest so gut wie das in einem Computer eben geht). Das heißt, hier wäre eher ein Datentyp für diskrete Werte angebracht, zum Beispiel ein Integer. Dann rechnest du eben in der Einheit von (ganzen) Cents.
Also rechnen würde ich so gesehen schon mit Integer. Es geht mir im Moment vor allem um die Eingabe der Zahl... Ich möchte aus "optischen" oder ästhetischen Gründen vermeiden, für die Eingabe nach Cent zu fragen.
Gruß,
Speedriff
-
Du musst dann die Eingabe als String entgegennehmen, den Dezimalpunkt entfernen und in Integer konvertieren.
Idealerweise vorher noch den String auf Plausibilität prüfen, zB. nur Ziffern, max. ein Dezimalpunkt ...
-
Speedriff schrieb:
SeppJ schrieb:
Du würdest ja auch (hoffentlich) keine Postleitzahlen als Integer verarbeiten, bloß weil sie (in manchen Schreibweisen) aussehen wie Ganzzahlen.
Nun ja, ehrlich gesagt hätte ich für Postleitzahlen sehr wohl Integer benutzt. Das scheint mit meinem jetzigen Anfängerwissen eine gute Idee ?!
Was wird z.B. aus "04435 Flughafen Leipzig/Halle Stadt Schkeuditz"?
-
@Speedriff
Für Teile von Adressen nimmt man Strings. Guck dir mal z.B. britische Adressen an. Die haben so Postleit"zahlen" ("post codes") wie z.B. "SW7 2AP". Speicher das mal in einem Integer.Für Geld nimmt man Fixkomma. Ein gängiger Scaling-Faktor ist 10000, also 4 dezimale Nachkommastellen. Wobei das auch nur geeignet ist wenn man bloss Beträge speichern will. Will man rechnen (mehr als + und -), dann muss man sich schlau machen wie die Anforderungen aussehen. Dazu gibt es in den meisten Ländern Gesetze die regeln wann wo auf wie viele Stellen und nach welchen Regeln gerundet wird.
-
Speedriff schrieb:
Also rechnen würde ich so gesehen schon mit Integer. Es geht mir im Moment vor allem um die Eingabe der Zahl... Ich möchte aus "optischen" oder ästhetischen Gründen vermeiden, für die Eingabe nach Cent zu fragen.
Schreib Dir doch Deine Eingabe selbst.
Also einen Integer einlesen, ein Trennzeichen einlesen noch einen Integer. Und dann richtig zusammenrechnen.Das geht natürlich beliebig ausgefuchst: Was ist mit negativen Beträgen, was ist Zehntelcents usw. usf.
Aber letztlich ist einen float zu lesen, wenn man einen Betrag haben will auch nicht das gelbe vom Ei. Z.B. ist123.456e7zwar eine gültige eingabe aber ist das gewollt?