Nur ne Kleinigkeit



  • Guten Tag,

    ich habe eine kleine Frage zu meinem Programm.
    Es harkt leider immer bei Kleinigkeiten 😞

    Wie schreibe ich es, wenn ich zum Beispiel die 9% Ebaygebühren von einem Ertrag ausrechnen möchte? Mein Programm sieht ungefähr wie folgt aus:

    ---------------------------------------------------------
    int main(void)
    float Ertrag, Gewinn;
    {
    printf("Wieviel Euro hat der Artikel gebracht?");
    scanf("%d", &Ertrag);

    printf("Abzüglich der Gebühren brachte der Artikel: %d", Ertrag-(Ertrag/100*9));

    return 0;
    }
    ---------------------------------------------------------

    Irgendwas mache ich an der Rechung falsch.
    Ich möchte ja lediglich, dass das Programm mir sagt, dass wenn mein Artikel 30 Euro gebracht hat, der Gewinn = 27,30 Euro ist.

    Ich hoffe es stört hier niemanden, wenn ein älterer Herr, der sich nebenbei etwas weiterbilden will mal euro Hilfe benötigt.

    Vielen Dank im vorraus !



  • %d ist bei scanf zum einlesen von ganzzahlingen Dezimalzahlen da.
    %d ist bei printf zum ausgeben von ganzzahlingen Dezimalzahlen da.

    Zum einlesen von float bei scanf ist %f vorgesehen.
    Zum ausgeben von float bei printf ist %f vorgesehen.

    Die Variabledefinition gehört mit in den Codeblock von main (also hinter die { ).



  • Vielen Dank für die Schnelle Antwort. Spitze Forum !!

    Nur man fällt ja von der einen Frage in die nächste. Also eine hab ich noch:
    Was mache ich jetzt falsch ? Weil die Rechnung stimmt nicht wenn ich sie mit dem Taschenrechner kontrolliere.

    Als Wert habe ich 31,20 Euro genommen.
    Rauskommen sollte 28,392. Es kommt aber 28,21000

    -------------------------------------------------------------

    int main(void)
    {
    float Einkommen;

    printf("Wieviel Euro haben die Gläser bei Ebay gebracht: ");
    scanf("%f", &Einkommen);

    printf("\nAbzüglich der 9 Prozent bleibt ein Ertrag von: %f Euro\n", Einkommen-(Einkommen/100*9));

    return 0;
    }
    -------------------------------------------------------------

    Danke DirkB


  • Mod

    Du hast vermutlich 31,20 eingegeben. Dein Computer spricht Englisch. 31.20 ist das, was du meinst.

    Ein Fließkommazahl (die Computerrepräsentation des Kontinuums) ist übrigens denkbar ungeeignet als Datentyp für eine diskrete Größe wie Geld.



  • SeppJ schrieb:

    Du hast vermutlich 31,20 eingegeben. Dein Computer spricht Englisch. 31.20 ist das, was du meinst.

    Ein Fließkommazahl (die Computerrepräsentation des Kontinuums) ist übrigens denkbar ungeeignet als Datentyp für eine diskrete Größe wie Geld.

    So ist es. 👍

    Abzüglich der 9 Prozent bleibt ein Ertrag von: 28.392001 Euro

    Float könnte man durch double ersetzen

    double Einkommen2 = 31.20; 
    printf("\nAbzüglich der 9 Prozent bleibt ein Ertrag2 von: %g Euro\n", Einkommen2-(Einkommen2*9/100));
    

    Abzüglich der 9 Prozent bleibt ein Ertrag2 von: 28.392 Euro

    Wie SeppJ ja bereits angemerkt hat sollten wichtige Rechnungen,
    also z.B. solche mit Geld nicht mit diesen Datentypen erfolgen.

    Zum Einen lassen sie sich nicht auf Gleichheit prüfen zum Anderen verursachen
    grosse und kleine Zahlen in einer Formel Fehler.

    ->Wie oben bereits gezeigt sollte man auch erst multiplizieren und dann
    dividieren - oft kommt nicht das gleich raus ...

    Die Gleitpunktzahlen 1234,12345 und 1234,123999 als float-Zahlen sind für den
    Computer nicht unterscheidbar ...
    siehe: <link entfernt s.u.>

    Hinweis:
    Wenn ausschließlich mit Zahlen, die nur wenige Nachkommastellen haben,
    gerechnet werden soll lassen sich die Rechenschritte mit Integer-Operationen
    ausführen.



  • merano schrieb:

    Die Gleitpunktzahlen 1234,12345 und 1234,123999 als float-Zahlen sind für den
    Computer nicht unterscheidbar ...
    ... hier stand ein untauglicher Pfusch-Link

    Totaler Quatsch,
    1. einen Pfuscher JW Link hier zu nennen
    2. den Pfuscher JW Unsinn hier nachzuplappern

    Für float hängt die Dezimalstellensignifikanz ausschließlich von FLT_DIG ab und nicht von irgendwelche Annahmen irgendwelcher Fachbuchautoren.

    merano schrieb:

    Hinweis:
    Wenn ausschließlich mit Zahlen, die nur wenige Nachkommastellen haben,
    gerechnet werden soll lassen sich die Rechenschritte mit Integer-Operationen
    ausführen.

    Eben nicht, zumindest wenn mit großen Zahlen gerechnet wird und man kein (Nicht-C89) long long int zur Verfügung hat.



  • Wutz schrieb:

    merano schrieb:

    Die Gleitpunktzahlen 1234,12345 und 1234,123999 als float-Zahlen sind für den
    Computer nicht unterscheidbar ...
    ... hier stand ein untauglicher Pfusch-Link

    Totaler Quatsch,
    1. einen Pfuscher JW Link hier zu nennen
    2. den Pfuscher JW Unsinn hier nachzuplappern

    Für float hängt die Dezimalstellensignifikanz ausschließlich von FLT_DIG ab und nicht von irgendwelche Annahmen irgendwelcher Fachbuchautoren.

    Ich gebs zu: Hab das nicht selbst geprüft. Was ich aber nun nachgeholt habe mit folgendem resultat:

    float a = 1234.12345;
    float b = 1234.123999;
    
    printf("a=%f, b=%f", a, b);
    
    Ergebnis:
    [code]a=1234.123413, b=1234.124023
    
    double a = 1234.12345;
    double b = 1234.123999;
    
    printf("a=%e, b=%e", a, b);
    
    a=1.234123e+003, b=1.234124e+003
    
    double a = 1234.12345;
    double b = 1234.123999;
    
    printf("a=%g, b=%g", a, b);
    
    a=1234.12, b=1234.12
    

    Also wie man sieht - deutlich unterscheidbar 🤡
    Aber leider doch immer falsch! Die Aussage mit der Unzuverlässlichkeit stimmt
    also. Den Link zum Pfuschbuch lösche ich dann sicherheitshalber 😉

    Kannst Du denn eine praktikable Alternative zu (Long-)Integer-Operationen
    vorschlagen?



  • Wie wärs mit ein paar mehr Nachkommastellen bei der Ausgabe (zumindest bei den double Beispielen)?


  • Mod

    merano schrieb:

    Also wie man sieht - deutlich unterscheidbar 🤡

    In deiner Implementierung vielleicht. Sag mal voraus, wie sich wohl double und long double zueinander verhalten, dann prüfst du, wie es bei deinem System darum bestellt ist.

    Aber leider doch immer falsch! Die Aussage mit der Unzuverlässlichkeit stimmt
    also. Den Link zum Pfuschbuch lösche ich dann sicherheitshalber 😉

    Du hast das Problem anscheinend gar nicht verstanden. Bloß weil Geldangaben ein Komma enthalten, sind sie nicht durch Floatzahlen darstellbar! Das ist genau der gleiche Unsinn, wie Telefonnummern oder Kontonummern als Integer zu behandeln. Bloß weil etwas aussieht wie eine Zahl, ist es nicht unbedingt eine! Bloß weil etwas aussieht wie eine Fließkommazahl ist es keine! Geld ist eine diskrete Größe, du kannst nicht beliebig kleine Teile davon haben. Eine Fließkommazahl ist aber gerade dazu da, letzteres auf dem (diskreten) Computer möglichst gut zu simulieren.

    Kannst Du denn eine praktikable Alternative zu (Long-)Integer-Operationen
    vorschlagen?

    Üblich wäre ein eigener Datentyp für Geld, Integer zu nehmen ist bloß ein Notbehelf für Anfänger.



  • merano schrieb:

    Aber leider doch immer falsch!

    Der "Fehler" liegt vor allem darin, dass die Ausgabe was knapp bestellt ist.

    printf("a=%5.13lg, b=%5.13lg", a, b);
    

    liefert mal gleich was anderes...

    Kannst Du denn eine praktikable Alternative zu (Long-)Integer-Operationen
    vorschlagen?

    Für Deine Berechnungen sind doubles sicherlich ausreichend.

    Du kannst aber auch einfach in Cent rechnen:

    long Einkommen;
    
    printf("Wieviel Cent haben die Gläser bei Ebay gebracht: ");
    scanf("%ld", &Einkommen);
    
    printf("\nAbzüglich der 9 Prozent bleibt ein Ertrag (%ld) von: %ld Cent\n", Einkommen, Einkommen - ( Einkommen * 9 / 100 ) )
    

    Ciao MM


  • Mod

    Martiniclan schrieb:

    Kannst Du denn eine praktikable Alternative zu (Long-)Integer-Operationen
    vorschlagen?

    Für Deine Berechnungen sind doubles sicherlich ausreichend.

    Nein! eine Umstellung von float nach double geht an der eigentlichen Problemursache vorbei. Man bekommt dadurch bloß mehr Neunen in der Ausgabe

    Du kannst aber auch einfach in Cent rechnen:

    Das schon eher. Wobei man für eine perfekte Lösung noch die von Wutz angesprochenen Probleme beachten sollte. Für ein Übungsprogramm aber voll ausreichend.


Anmelden zum Antworten