Fehler in der Ausgabe einer Berechnung bei double
-
Hallo zusammen,
ich erarbeite im Zusammenhang einer Übung folgendes Beispiel:#include <iostream> #include <cstdio> using namespace std; double steuer (double msteuer) { double resultat = msteuer; return resultat; } double netto (double bruttopreis) { double mwst; double resultat = bruttopreis / (1 + (mwst / 100)); return resultat; } double brutto (double nettopreis) { double mwst; double resultat = nettopreis / (1 - (mwst / 100)); return resultat; } int main(void) { double wert1, zahl2; double netto1, brutto1, mwst; char a; cout << "\nBitte geben Sie die den Betrag, die Steuer und als Buchstabe (N)etto und (B)rutto" << endl; cout << "\nBespiel: 100 10 N \n" << endl; cin >> wert1 >> zahl2 >> a; mwst = steuer(zahl2); if(a=='N') { netto1 = netto(wert1); cout << "\nDer Nettowert von " << wert1 << " betraegt! " << netto1 << endl; } else { if(a=='B') { brutto1 = brutto(wert1); cout << "\nDer Bruttowert von " << wert1 << " betraegt! " << brutto1 << endl; } else { cout << "\nUngueltige Eingabe" << endl; } } fflush(stdin); getchar(); return 0; }Dadurch bekomme ich aber einen Falschen Wert. Im Beispiel für 100 10 N kommt statt der erwarteten 90 eine 90.9091 raus. Sobald ich allerdings die Variablen der main-Funktion von double auf int ändere kommt der erwartete Wert von 90 und die Warnung das ich ein double-Wert in einen int-Wert ändere.
Auf den ersten Blick (ca. 2 Stunden lang) kann ich gerade den Fehler nicht erkennen.
-
Da sollte allgemein nur Mist rauskommen, weil viele deiner Variablen uninitialisierte Werte haben. Guck dir nochmal genau an, welche Variable wo gültig ist und welchen Wert sie hat. Tipp: Du hast zwar manche Variablen, die den gleichen Namen haben, aber diese Namen beziehen sich nicht auf die selbe Variable!
double ist übrigens ein sehr, sehr ungünstiger Typ, um mit Geld zu rechnen (Klartext: Es ist falsch). Das was du hier beobachtest, hat jedoch nicht direkt damit zu tun, das liegt an den oben genannten Fehlern im Programm.
-
Hallo SeppJ,
Ich komm im Moment auf keine elegantere Lösung um die Mehrwertsteuer, die ich von der Tastatur einlese, an die beiden Funktionen zu übergeben.
Das Problem mit der falschen Ausgabe ist wohl die verwendetet Formelresultat = bruttopreis / (1 + (mwst / 100))// Edit:
Mit der Änderung der besagten Formel klappts nun auch mit der Berechnung und den Ergebnissen:
#include <iostream> #include <cstdio> using namespace std; double steuer (double msteuer) { double resultat = 0; resultat = msteuer / 100; return resultat; } double netto (double bruttopreis=0) { double mwst; double resultat = 0; resultat = bruttopreis - (bruttopreis * mwst); return resultat; } double brutto (double nettopreis=0) { double mwst; double resultat = 0; resultat = nettopreis + (nettopreis * mwst); return resultat; } int main(void) { double wert1=0, zahl2=0; double netto1=0, brutto1=0; double mwst=0; char a; cout << "\nBitte geben Sie die den Betrag, die Steuer und als Buchstabe (N)etto und (B)rutto" << endl; cout << "\nBespiel: 100 16 N \n" << endl; cin >> wert1 >> zahl2 >> a; mwst = steuer(zahl2); if(a=='N') { netto1 = netto(wert1); cout << "\nDer Nettowert von " << wert1 << " betraegt! " << netto1 << endl; } else { if(a=='B') { brutto1 = brutto(wert1); cout << "\nDer Bruttowert von " << wert1 << " betraegt! " << brutto1 << endl; } else { cout << "\nUngueltige Eingabe" << endl; } } fflush(stdin); getchar(); return 0; }// Edit:
Wo ich mir immer noch nicht sicher bin ist die Übergabe der Variable mwst an die beiden Funktionen.
-
Addiy schrieb:
Hallo SeppJ,
Ich komm im Moment auf keine elegantere Lösung um die Mehrwertsteuer, die ich von der Tastatur einlese, an die beiden Funktionen zu übergeben.Dann guck dir mal an, wie Funktionen funktionieren. Ich nehme mal an, genau das ist das momentane Kapitel in deinem Kurs/Lehrbuch?
Das Problem mit der falschen Ausgabe ist wohl die verwendetet Formel
resultat = bruttopreis / (1 + (mwst / 100))Nein, der Fehler ist der, den ich dir genannt habe. Aber deine Erwartungen sind auch falsch. Du machst genau den Fehler, den viele Leute machen:
Im Beispiel für 100 10 N kommt statt der erwarteten 90 eine 90.9091 raus.
Sicher?
(Dass du trotzdem das korrekte Ergebnis bekommst, ist übrigens reines Glück (oder Pech, das du so den Fehler nicht bemerkst). Der Code ist trotzdem gravierend falsch!)
-
Die Funktionen sind das Thema der Übung.
Kann sein das ich im Moment total auf den Schlauch stehe, aber ich dachte immer das 10% von 100 10 sind und das damit der Nettowert von 100 90 beträgt, wenn 10% Steuern angesetzt sind. Ich bin mir aber im Moment wirklich nicht mehr so sicher, das ich da nicht schon einen Denkfehler habe.Mir ist bekannt das Funktionen entweder "call by value" oder "call by reference" arbeiten. Vermutlich müsste ich bei den beiden Funktionen die Ergebisse liefern sollte "call by refrence" verwenden. Da ich ja den eingegeben Wert verändere und bei der Funktion für die mwst dann "call by value" da ich den Eingelesenen Wert nicht verändere, wobei ich ja nun dies mit dem geänderten Code doch mache..
Vielleicht ist das einfach auch schon zu spät heute um noch klare Gedanke zu fassen...
//Edit:
Da ist mir doch gerade noch eine Idee gekommen. Ich kann die Schleifen nur für die Abfrage benutzen und dann entsprechend an die Funktion übergeben und die Ausgabe dann innerhalb der Funktion umsetzen. Damit sollte sich das Problem mit der Übergabe der Variablen lösen lassen.
Nur die Berechung und die Übergabe der Steuer will mir noch nicht so recht in den Kopf...
-
Vielleicht so? Keine Ahnung, was das genaue Ziel ist, du hast ja direkt Code gepostet.
#include <iostream> #include <cstdio> using namespace std; double steuer (double msteuer) { double resultat = msteuer / 100; return resultat; } double netto (double bruttopreis, double mwst) { double resultat = bruttopreis - (bruttopreis * mwst); return resultat; } double brutto (double nettopreis, double mwst) { double resultat = nettopreis + (nettopreis * mwst); return resultat; } int main(void) { double wert1=0, zahl2=0; double netto1=0, brutto1=0; char a; cout << "\nBitte geben Sie die den Betrag, die Steuer und als Buchstabe (N)etto und (B)rutto" << endl; cout << "\nBespiel: 100 16 N \n" << endl; cin >> wert1 >> zahl2 >> a; double mwst = steuer(zahl2); if (a=='N') { netto1 = netto(wert1, mwst); cout << "\nDer Nettowert von " << wert1 << " betraegt! " << netto1 << endl; } else if (a=='B') { brutto1 = brutto(wert1, mwst); cout << "\nDer Bruttowert von " << wert1 << " betraegt! " << brutto1 << endl; } else { cout << "\nUngueltige Eingabe" << endl; } cin.get(); return 0; }
-
Ok ich lass das erstmal mit der Eingabe der Steuer über die Tastatur weg und setze diesen als festen Wert an.
Wenn man nun von der Verwendung von double für die Variablen ab sieht, ist dann zumindestens der Rest schon mal soweit richtig oder gibt es da auch noch Fehler in der Umsetzung.
Ich bin ja noch am lernen von dem ganzen.
Mit den einlesen des Wertes für die Steuer und der Übergabe in die Funktionen muss ich mir noch mal genau Gedanken machen.#include <iostream> #include <cstdio> using namespace std; double netto(double bruttopreis) { const double mwst = 10.0; double resultat = 0; resultat = bruttopreis / (1+ (mwst / 100)); cout << "\nDer Nettowert von " << bruttopreis << " betraegt! " << resultat << endl; return 0; } double brutto(double nettopreis) { const double mwst = 10.0; double resultat = 0; resultat = nettopreis / (1- (mwst / 100)); cout << "\nDer Bruttowert von " << nettopreis << " betraegt! " << resultat << endl; return 0; } int main(void) { double wert1=0; double netto1=0, brutto1=0; char a; cout << "\nBitte geben Sie die den Betrag und als Buchstabe (N)etto und (B)rutto" << endl; cout << "\nBespiel: 100 N \n" << endl; cin >> wert1 >> a; if(a=='N') { netto1 = netto(wert1); } else { if(a=='B') { brutto1 = brutto(wert1); } else { cout << "\nUngueltige Eingabe" << endl; } } fflush(stdin); getchar(); return 0; }
-
hjkhjk schrieb:
Vielleicht so? Keine Ahnung, was das genaue Ziel ist, du hast ja direkt Code gepostet.
netto1 = netto(wert1, mwst);Mahh, verdammt ich kann ja der Funktion auch mehr Werte übergeben.... ich hatts die ganze Zeit vor Augen aber ich bin einfach nicht darauf gekommen. Danke Dir!
-
Addiy schrieb:
Die Funktionen sind das Thema der Übung.
Kann sein das ich im Moment total auf den Schlauch stehe, aber ich dachte immer das 10% von 100 10 sind und das damit der Nettowert von 100 90 beträgt, wenn 10% Steuern angesetzt sind. Ich bin mir aber im Moment wirklich nicht mehr so sicher, das ich da nicht schon einen Denkfehler habe.Die Ware kostet eigentlich 90 Euro. Aber dann kommen noch 10% Steuern drauf. Was kostet die Ware nun? 99 Euro! Darum sind in einem Endpreis von 100% keine 10 Euro Steuern drin.
edit: Zum Rest: Gerade keine Zeit zum gucken.