Konvertierung von string zu float



  • Liebe Mitglieder der Comunity

    Ich habe ein Problem mit der Konvertierung von std::string in float

    bsw "4,76"

    Wen ich meine Konvertierungsfunktion benutze,
    hat die float variable jedoch den wert 4.0000000 und nicht 4,7600000
    die Nachkommerstellen fehlen.

    Ich habe im Debugger alles überprüft.
    Str = "4,76"
    f = 4.0000000

    die Funktion sieht so aus

    float FW_API STRING_TO_FLOAT(const std::string &Str)
    {
    	std::stringstream sstr;
    	float f;
    	sstr << Str;
    	sstr >> f;
    
    	return f;
    }
    

    bei atof kommt das selbe.



  • Probier mal 4.76



  • ahhhhh, daran hat es gelegen.

    Jetzt muss ich nur noch eine Konvertierungsfunktion schreibe, die "3,59" in "3.59" konvertiert, weil ich die Strings aus den GUI Objkten direkt auslese.

    Danke für den Tipp.



  • Musst du nicht.
    Füg folgendes nach Zeile 3 ein:

    sstr.imbue(std::locale(""));
    

    Das setzt die Locale vom Stream auf die Standard-Locale des OS, in deinem Fall wohl Deutsch und ermöglicht somit Zahlen etc. wie in Deutsch üblich ein und auszugeben.



  • OK. funktioniert ebenso.

    Jedoch eine Frage noch.

    Wenn ich "4,56" in float konvertiere, kommt 4,5599999 (oder ähnliches) heraus. kann man die zahl auf die 2 nachkommerstelle runden? (4,4600000)

    Ich meine ich häte mal etwas darüber gelesen, warum die Werte minimal abweichen.



  • Sebastian Müller schrieb:

    Ich meine ich häte mal etwas darüber gelesen, warum die Werte minimal abweichen.

    Weil floats Gleitkommazahlen im Binärsystem, mit begrenzter Genauigkeit sind.
    Und da 4,56 nicht als endliche Binäre Kommazahl darstellbar ist, ist der Wert der Variable eben auch nicht 4,56 -- sondern die näheste darstellbare Zahl.

    Wenn du exakte Berechnungen brauchst darfst du kein Float verwenden.
    Wenn du nur zwecks der Optik die angezeigten Kommastellen limitieren willst, dann kannst du das natürlich machen.
    z.B. mit dem Stream Manipulatoren setprecision und fixed
    http://www.cplusplus.com/reference/iomanip/setprecision/



  • Jetzt fält es mir wieder ein. Danke.


Anmelden zum Antworten