it-swarm.com.de

Float in String konvertieren, mit Genauigkeit und Anzahl der angegebenen Dezimalstellen?

Wie konvertiert man ein Float in eine Zeichenfolge in C++ und gibt dabei Genauigkeit und Anzahl der Dezimalstellen an? 

Zum Beispiel: 3.14159265359 -> "3.14"

57
Shannon
#include <iomanip> // setprecision
#include <sstream> // stringstream

double pi = 3.14159265359;
stringstream stream;
stream << fixed << setprecision(2) << pi;
string s = stream.str();

Siehe Festgelegt

Feste Gleitkommanotation verwenden

Setzt das floatfield-Formatflag für den str -Stream auf fixed.

Wenn floatfield auf fixed gesetzt ist, werden Gleitkommawerte in Festkomma-Notation geschrieben: Der Wert wird mit genau so vielen Stellen im Dezimalteil dargestellt, wie durch das Genauigkeitsfeld (precision) und mit Nein angegeben Exponententeil.

und setprecision .

84
AlexD

Die übliche Methode, um solche Dinge zu tun, ist "in Zeichenfolge drucken". In C++ bedeutet das, std::stringstream zu verwenden:

std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
23
Mats Petersson

Eine weitere Option ist snprintf :

double pi = 3.1415926;

std::string s(16, '\0');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);

Demo . Die Fehlerbehandlung sollte hinzugefügt werden, d. H. Nach written < 0 suchen.

8
Columbo

Sie können die fmt::format-Funktion aus der {fmt} -Bibliothek verwenden :

#include <fmt/core.h>

int main()
  std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}

wobei 2 eine Genauigkeit ist.

Diese Formatierungsfunktion wurde zur Standardisierung in C++ vorgeschlagen: P0645 . Sowohl P0645 als auch {fmt} verwenden eine Python-ähnliche Formatstringsyntax, die der von printf ähnelt, jedoch {} als Trennzeichen anstelle von % verwendet.

2
vitaut

Ich gebe hier ein negatives Beispiel, bei dem Sie vermeiden möchten, dass Gleitkommazahlen in Strings umgewandelt werden. 

float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;

Du kriegst

99463 99.463 99.462997

Hinweis: Die Variable num kann einen beliebigen Wert nahe 99.463 haben. Sie erhalten denselben Ausdruck. Es geht darum, die praktische Funktion "to_string" von c ++ 11 zu vermeiden. Ich habe eine Weile gebraucht, um aus dieser Falle zu kommen. Der beste Weg ist die Stringstream- und Sprintf-Methode (C-Sprache). C++ 11 oder neuer sollte einen zweiten Parameter als Anzahl der Stellen nach dem anzuzeigenden Fließkommawert angeben. Im Moment ist der Standardwert 6. Ich setze dies so ein, dass andere keine Zeit mit diesem Thema verschwenden.

Ich habe meine erste Version geschrieben. Bitte lassen Sie mich wissen, wenn Sie einen Fehler finden, der behoben werden muss. Sie können das genaue Verhalten mit dem iomanipulator steuern. Meine Funktion zeigt die Anzahl der Nachkommastellen an.

string ftos(float f, int nd) {
   ostringstream ostr;
   int tens = stoi("1" + string(nd, '0'));
   ostr << round(f*tens)/tens;
   return ostr.str();
}
1
Kemin Zhou