[Novize] Irgendwo passt der type cast nicht...!



  • Hallo Leute,

    Habe wieder mal an einer Übung aus meinem Lehrbuch gearbeitet und die Aufgabe FAST richtig gelöst. Leider schleichen sich kleine Detailfehler ein - welche wohl im Zusammenhang mit einem float zu long cast stehen.

    Hier der Code:

    #include <stdio.h>
    
    int main(void)
    {
    
    	float amounts[5];
    	long dollars[5], cents[5];
    	int i; int j;
    
    	for(i = 0; i < 5; i++)
    	{
    		printf("Enter the monetary amounts: ");
    		scanf("%f",&amounts[i]);
    		dollars[i] = (long)amounts[i];
    		cents[i] = 100*(amounts[i]-dollars[i]);
    	}
    
    	for(j = 0;j < 5; j++)
    	{
    		printf("amount of [%d] is $%ld,%ld\n",j,dollars[j],cents[j]);
    	}
    
    	return 0;
    }
    

    Ausgabe:

    Enter the monetary amounts: 2.75
    Enter the monetary amounts: 1.25
    Enter the monetary amounts: 3.56
    Enter the monetary amounts: 4.56
    Enter the monetary amounts: 8.88
    amount of [0] is $2,75
    amount of [1] is $1,25
    amount of [2] is $3,55
    amount of [3] is $4,55
    amount of [4] is $8,88
    

    Wie man sieht sind bei den Elementen [2] und [3] jeweil $0,01 abhanden gekommen...
    Das liegt meiner Einschätzung nach an Rundungs(fehlern).

    Inwiefern habe ich bei den casts was falsch geordnet oder nicht beachtet...

    Gruß Charlie


  • Mod

    Du hast Fließkommazahlen nicht verstanden. Fließkommazahlen sind der anti-geeignetste Datentypen für diskrete Größen wie Geld, denn sie stellen das genaue Gegenteil dar. Nimm kein float für Geld. Das ist als würde deine Bank dir statt eines Kontoauszuges ein Maßband geben, auf der dein Kontostand markiert ist.

    Der Cast ist übrigens vollkommen unnötig und macht überhaupt nichts. Arithmetische Datentypen ( = Zahlen ) können frei ineinander konvertiert werden.

    int foo = 1;
    double bar = foo;
    char foobar = bar;  // Auch chars sind Zahlen.
    

    P.S.: Schneller Vorschlag:

    int dollar, cent;
        scanf("%d.%d", &dollar, &cent);
        printf("%d dollar, %d cent", dollar, cent);
    

    Ist natürlich noch leicht verbesserungsfähig, da man auch mehr als 99 Cents eingeben kann. Soll bloß ein Ansatz sein. scanf ist sehr mächtig. Guck dir mal an, was es alles kann.



  • ...



  • Na Jungs ihr habt mich da falsch verstanden. Die Aufgabenstellung gibt die Types vor. Ich soll damit wohl das casten weiter vertiefen. Kann mir nun jemand erklären wie es zu dem cent Rückfall kam?



  • Falke88(tmp) schrieb:

    Na Jungs ihr habt mich da falsch verstanden. Die Aufgabenstellung gibt die Types vor. Ich soll damit wohl das casten weiter vertiefen. Kann mir nun jemand erklären wie es zu dem cent Rückfall kam?

    Kurze Antwort: Rundungsfehler, weil nicht alle Zahlen durch float exakt dargestellt werden können.

    Lange Antwort: http://de.wikipedia.org/wiki/IEEE_754



  • Wärst du so gut und schreibst mir den Code so um das es passt? Dann kann ich das besser nachvollziehen.



  • Rechne gleich nach der Eingabe in Cent um.

    Du solltest auch deine Ausgabe bei einstelligen Centbeträgen überprüfen.



  • ...



  • 🙄 Ist doch noch zu früh am Morgen.
    (ich habe verpeilt, dass in den ersten Zeilen die Eingaben stehen)



  • Hi

    durch Rundungsfehler kommt es bei manchen Fällen zu so einem Ergebnis:

    24.999999997

    Das wird bei der Zuweisung zu einem int zu 24. Um das zu vermeiden hättest Du die Zuweisung so machen müssen:

    cents[i] = 100.0*(amounts[i]-dollars[i]) + 0.5;
    

    Dann hätte es gepasst. Dennoch, wie die anderen schon schrieben, hättest Du gleich ints nehmen sollen, aber das war Dir ja durch die Aufgabe nicht erlaubt.

    mfg Martin


Anmelden zum Antworten