ostream und double: Formatierung?



  • Hallo,

    ich benutze einen std::ostream , um double Werte in std::string umzuwandeln. Leider ist die Anzahl der Nachkommastellen auf 5 bzw. 6 begrenzt, ich möchte allerdings, dass der std::ostream ausreichend viele Nachkommastellen benutzt, um die ganze Zahl anzuzeigen. Die Benutzung von setprecision scheidet wohl aus, weil ich dafür zuerst die Anzahl der Nachkommastellen der Fließkommazahl bestimmen müsste. Das scheint mir irgendwie umständlich.
    Leider kann ich kein C++11 benutzen.

    Beispiele:

    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    using namespace std;
    
    string float_to_string( double v )
    {
       ostringstream oss;
       oss.imbue( locale( "" ) );
       oss << v;                        // Variante 1
       oss << fixed << v;               // Variante 2
       return v.str();
    }
    
    int main()
    {
       // Variante 1 liefert 3.14159
       string s1 = float_to_string( 3.1415926534 ); 
    
       // Variante 2 liefert 3.141593
       string s2 = float_to_string( 3.1415926534 ); 
    }
    

    Ich hätte gern eine Variante, die folgende Ausgaben produziert:
    3.141 -> "3.141"
    3.1415926534 -> "3.1415926534"

    Kriegt man sowas irgendwie über Manipulatoren hin?



  • Benutz doch einfach setprecision mit einer großen Zahl wie z.B. 20. Wenn deine Zahl vorher schon keine Nachkommastellen mehr hat, werden auch keine ausgegeben (ohne fixed). Dir ist aber bewusst, dass sich das mit der Darstellungsungenauigkeit etwas beisst?

    http://ideone.com/Lu9w9o



  • Hallo DocShoe,

    std::numeric_limits liefert Dir die gewünschte Information

    cout.precision( numeric_limits< double >::max_digits10 );
        cout << 1/7. << endl;
    

    ' max_digits10 ' wenn nach dem (Wieder-)Einlesen der identische double ankommen soll.

    Edit: .. ist C++11 - ok dann nimm 'digits10' und addiere ggf. 2.

    Gruß
    Werner



  • DocShoe schrieb:

    Ich hätte gern eine Variante, die folgende Ausgaben produziert:
    3.141 -> "3.141"
    3.1415926534 -> "3.1415926534"

    .. vielleicht sollte ich doch erst die ganze Frage lesen, bevor ich eine Antwort schreibe 😉

    Hallo DocShoe,

    dass wird schwierig (bis unmöglich!), da intern binär und nicht dezimal gerechnet wird.
    D.h. z.B. ein 0.2 ist definitiv != "0.2". Ein 0.5 dagegen ist genau gleich "0.5"
    Versuche es mal mit std::numeric_limits< double >::digits10 (ohne Addition von 2!). Allerdings werden dann die 0'en angehängt!

    Gruß
    Werner



  • Vielen Dank euch beiden.
    Ich brauche das lediglich für eine Formatierung zur Anzeige, mit der Rechengenauigkeit bzw.Datenspeicherung hat das nix zu tun.

    Meine STL kennt max_digits10 nicht, dafür aber digits10 mit dem Wert 15. Passt also. Ab 1012 wird allerdings die wissenschaftliche Darstellung gewählt, kann man das auch noch iwie abschalten?



  • DocShoe schrieb:

    Ab 1012 wird allerdings die wissenschaftliche Darstellung gewählt, kann man das auch noch iwie abschalten?

    .. mit std::fixed , nur hat dann der Wert in setprecision eine andere Bedeutung, nämlich die der Anzahl der Nachkommastellen.



  • Und das ist genau das Dilemma, in dem ich gerade stecke 😉


Anmelden zum Antworten