C++ Rundet die Werte?



  • Hallo Community.

    Ich habe da einen ganz schön komischen Bug. C++ ( gcc Version 4.3.3) rundet die Werte, wenn ich einen Double in einen Integer umwandle.

    Hier der Code von meiner Beispielklasse (Bruchrechnen Simulieren)

    Bruch::Bruch(const double val)
    {
    	int ganzZahl = val;   // BEISPIEL 2.8  ==> ganzZahl = 2
    	int nachkomma = (val - ganzZahl) * 10;  // Problem: nachKomma = 7?? nicht 8 ???
    
    	std::cout << " Ganzzahl: " << ganzZahl << "\t nachkomma: " << nachkomma << std::endl;
    
    	if(nachkomma == 0)
    	{
    		this->nenner = 1;
    		this->zaehler = ganzZahl;
    	}
    	else
    	{
    		this->nenner = nachkomma;
    		this->zaehler = (ganzZahl *  nachkomma)+1;
    	}
    }
    

    Woran könnte das liegen?

    Vielen Dank schonmal für die Antworten im Voraus 🙂

    Drake



  • Hab gerade noch etwas ausprobiert.

    Wenn ich 2 Nachkommastellen angebe (2.34) dann kommt das gewünschte Ergebnis heraus.



  • Wie sieht 0.8 in Binaerdarstellung aus? Wie sieht 10 in Fliesskommadarstellung aus?



  • Die Zahl 2.8 ist üblicherweise nicht exact durch ein double darstellbar.

    2,8 (dezimal) = 10,1100110011... (binär)
    

    Es kann also wegen der endlichen Genauigkeit sein, dass die am dichtesten an 2.8 darstellbare Zahl etwas kleiner ist und val diesen Wert repräsentiert: val < 2.8. Dann wäre (val-ganzZahl)*10 < 8, was die 7 erklärt, denn bei der Konvertierung von double nach int werden die Nachkommastellen einfach abgeschnitten.



  • Danke für die Antworten, hab ganz vergessen, dass der PC auch seine Grenzen hat ^^


Anmelden zum Antworten