Von double nach Int casten!!!!!!



  • Habe da einen Fehler beim casten von double nach int. Testet bitte mal den Quellcode und schaut mal was dabei rauskommt. Ich werde aus der Sache nicht schlau. Ich verwende Visual C++ 6.

    So habe folgenen Quellcode:

    double mbetrag;
    int mganzzahl;

    mbetrag = 33.41;
    mbetrag *= 100;

    mganzzahl = (int)mbetrag;

    Normal sollte ja in mganzzahl 3341 stehen, aber es steht 3340 drin. Der Quellcode ist nur ein Beispiel! Vielleicht hab ich da auch etwas in sachen C++ verpasst oder steh auf der Leitung. Ist das ein arithmetischerFehler der CPU? Für mich sieht das so aus.



  • Servus,

    Nö kein Fehler. Der rechnet das richtig du hast ja bei dem float typ mehrere Stellen hinter dem Komma. d.h. Der Wert 33.41 = 33.409998. Also 33.41 * 100 = 3340.

    Rechnung 33.41 * 100:

    33.409998 * 100 = 3340 (9998)

    mfg
    Hellsgore



  • Ich vergasse...
    Eine Lösung wäre es den Wert bevor du mit ihm rechnest ihn runden zu lassen. Ich kenne aber jetzt im mom keine Funktion dafür. Mir hängt nur noch die hier im Kopf:

    _fcvt

    Damit kannste einen float in einen string machen. Musst mal schauen irgendwo gabs da ne Func....

    mfg
    Hellsgore



  • In diesem Fall würde es ausreichen, vor dem Cast .5 zu addieren.



  • Servus,

    da sagste was.......... das is mir ja noch nie aufgefallen. Naja ich habs immer anders gemacht 🙂

    Hellsgore



  • Warum passiert das aber nicht mit allen Werten? Ich war neugierig und habe es mal ausprobiert.

    Mit den Werten 33.42 und 33.40 als Ausgangswert stimmte beispielsweise wieder alles.

    for (int i = 1; i < 40000; i++) // 40000 ist willkürlich gewählt
    	{
    		double mbetrag = i / 100.0; 
    		int mganzzahl; 
    
    		mbetrag *= 100; 
    
    		mganzzahl = static_cast<int> (mbetrag); 
    		if (mganzzahl != i)
    		{
    			TRACE("%10d != %10d       Diff: %10d\n", i, mganzzahl, mganzzahl-i);
    		}
    	}
    

    Das ist erstaunlich. So auf Anhieb habe ich da kein Muster erkennen können.

    😕 Bin verwirrt 😕



  • @Hellsgore: Naja wenn man es so sieht wie du, das mathematisch 33.41 = 33.409998 ist dann stimmt das ganze schon. Aber eigentlich sollte 33.41 = 33.41 sein oder? Also scheint irgendeine die CPU doch ein Problem mit den Kommastellen zu haben.



  • Brosi schrieb:

    Also scheint irgendeine die CPU doch ein Problem mit den Kommastellen zu haben.

    Nein.

    <Gebetsmühle>
    Gleitkommatypen sind prinzipiell ungenau.
    </Gebetsmühle>

    Gleitkommatypen werden intern als eine Art "Dualbruch" dargestellt, also eine Kommazahl im Dualsystem. Leider sind die meisten abbrechenden Dezimalbrüche, darunter auch 33.41, im Dualsystem nicht abbrechend, sondern periodisch. Da die Anzahl der Stellen begrenzt ist, wird die nächstliegende darstellbare Zahl gewählt. Die kann vom Wert her darüber oder darunterliegen. Wenn sie darüberliegt, merkst du beim Abschneiden der Nachkommastellen nichts davon, liegt sie darunter, fehlt eben was.



  • @MFK: Danke für die Erklärung 🙂 auch wenn dich das Beten müde macht, aber es hat mir das Hintergrundwissen gebracht, das ich suchte. Danke nochmal.


Anmelden zum Antworten