ostream und double: Formatierung?
-
Hallo,
ich benutze einen
std::ostream
, um double Werte instd::string
umzuwandeln. Leider ist die Anzahl der Nachkommastellen auf 5 bzw. 6 begrenzt, ich möchte allerdings, dass derstd::ostream
ausreichend viele Nachkommastellen benutzt, um die ganze Zahl anzuzeigen. Die Benutzung vonsetprecision
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?
-
Hallo DocShoe,
std::numeric_limits
liefert Dir die gewünschte Informationcout.precision( numeric_limits< double >::max_digits10 ); cout << 1/7. << endl;
'
max_digits10
' wenn nach dem (Wieder-)Einlesen der identischedouble
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 aberdigits10
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 insetprecision
eine andere Bedeutung, nämlich die der Anzahl der Nachkommastellen.
-
Und das ist genau das Dilemma, in dem ich gerade stecke