Problem mit stringstream



  • Hi,

    hab da nen Problem beim Konvertieren von string nach double.

    stringstream convert;
    double tmpValue;
    double dVar;
    string value;
    
    // value wurde aus einer Datei gelesen (Inhalt: "30.4142141241")
    convert << value;
    cout << convert.str() << endl;
    
    convert >> tmpValue;
    cout << setprecision(12) << tmpValue << endl;
    
    dVar = atof(convert.str().data());
    cout << dVar<< endl;
    

    Bei der Ausgabe steht im stream und in dVar der richtige Wert. In tmpValue aber ab der 4. Kommastelle falsch, mache ich da was falsch ?

    30.4142141241     // stream Inhalt
    30.4142131805     // stream nach double
    30.4142141241     // atof
    

    Sry für die Namen, habs jetzt mal aus meinem Code rauskopiert und dVar ist als test reingerutscht 🙂

    Generell ist das ganze nur zum testen, ob das auch ein double ist, wird also wieder in nen String geschrieben. Wollte es mit c++ lösen, daher der stream, aber wenn es nicht geht, werde ich wohl doch atof benutzen 😕

    Schon mal danke, hoffe mir kann jemand helfen.



  • Hab dein Beispiel jetz mal getestet, aber nur die stringstream variante, und die funktioniert einwandfrei. sowol der Stringstream also auch die double Variable haben den gleichen inhalt.

    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    int main(){
    
    	std::stringstream convert;
    	double tmpValue;
    	convert<<"30.4142141241"; //Den Inhalt weise ich gleich direkt zu, ohne datei
    
    	convert >> tmpValue; //Inhalt tmpValue: 30.414214124099999
    	std::cout << std::setprecision(12) << tmpValue << std::endl;
    
    	return 0;
    };
    

    Mit welchem Compiler arbeitest du? Poste mal den ganzen code (inkl. Header)



  • Oh man, manchmal sieht man den Wald vor lauter Bäumen nicht...

    Hatte den cout erst ohne setprecision(12) und nachdem dabei nur begrenzt Nachkommastellen angezeigt wurden, habe ich den Datentyp zum testen auf float umgestellt und später vergessen ihn wieder auf double zu setzen 🙄

    Aber trotzdem danke. Nachdem dein Beispiel einwandfrei bei mir lief, hab ich den Code doch nochmal genauer betrachtet 👍



  • So habe noch eine Frage zum stringstream und hab trotz Bemühungen keine Lösung gefunden.

    Ich würde gerne einen String in double umwandeln (das hab ich ja), damit rechnen und ihn wieder in einen String umwandeln. Dabei sollte das Format der Eingabe beibehalten werden.

    Soll heißen, wenn die Zahl 4 Nachkommastellen im String hatte, soll sie auch so im stringstream bzw. im double 4 Nachkommastellen besitzen. Am besten sollte auch erkannt werden, ob die zahl mit Exponent angegeben wurde. Also der Ausgabestring soll das gleiche Format wie der Eingabestring besitzen.

    Könnte eine Funktion bauen, in der ich alle Zeichen durchgehe, um die Daten, die ich dafür brauche, zu parsen (Zeichen nach dem Dezimalpunkt bzw. nach "e" suchen). Das geht aber bestimmt auch besser oder ?

    Wenn man von python kommt ist das mit den Strings in c++ echt bescheiden 😡



  • Also das double selbst kann sich schlecht deine Anforderungen merken. Das geht technisch überhaupt nicht, auch in Python bestimmt nicht.

    Wenn du alle diese originalen Informationen der Eingabe behalten willst, solltest du einfach den eingegeben String "merken". Und diesen String nur nach Bedarf (wenn du rechnen willst) nach double umwandeln.

    Suchfunktionen (z.B. nach e suchen) ist doch mit der String-Klasse möglich:
    http://www.cplusplus.com/reference/string/string/

    Speziell: http://www.cplusplus.com/reference/string/string/find/



  • Ok, danke. Werde mir dann wohl selbst was schreiben.

    Das mit dem Exponenten hätte ich raussuchen müssen. Aber die Anzahl der Nachkommastellen gibt Python wenigstens so wie es eingegeben wurde zurück. Bei c++ ist setprecision ja auf 6 eingestellt...


Anmelden zum Antworten