J'ai un tas d'entiers que je mets dans stringstream
s. Maintenant, je veux changer les stringstream
s en string
s tout en gardant une précision constante avec les string
s. Comment ferais-je ça? Je sais que je peux utiliser stringstreams.precision()
, mais cela ne fonctionne pas pour une raison quelconque:
float a = 5.23;
float b = 3.134;
float c = 3.0;
std::stringstream ta;
std::stringstream tb;
std::stringstream tc;
ta << a;
tb << b;
tc << c;
ta.precision(2);
tb.precision(2);
tc.precision(2);
std::string out = "";
out += ta.str() + "\n";
out += tb.str() + "\n";
out += tc.str() + "\n";
Reviendra 5.23\n3.134\n3.0
, plutôt que 5.23\n3.13\n3.00
Je pense que votre problème est que precision()
définit la précision utilisée dans les futures opérations d'insertion de flux, pas lors de la génération de la chaîne finale à présenter. Autrement dit, en écrivant
ta << a;
tb << b;
tc << c;
ta.precision(2);
tb.precision(2);
tc.precision(2);
Vous définissez precision
trop tard, car les trois premières lignes ont déjà converti les nombres à virgule flottante en chaînes en utilisant la précision par défaut.
Pour résoudre ce problème, essayez de changer l'ordre dans lequel vous exécutez ces instructions en
ta.precision(2);
tb.precision(2);
tc.precision(2);
ta << a;
tb << b;
tc << c;
Cela entraînera les écritures dans le stringstream
à utiliser votre précision personnalisée plutôt que les valeurs par défaut existantes.
Cependant, l'effet du modificateur precision
n'est significatif que si vous indiquez explicitement au flux que vous souhaitez utiliser une notation à précision fixe ou scientifique pour la sortie. Pour ce faire, vous pouvez utiliser les modificateurs fixed
ou scientific
:
ta.precision(2);
tb.precision(2);
tc.precision(2);
ta << fixed << a;
tb << fixed << b;
tc << fixed << c;
Cela affichera correctement le nombre approprié de chiffres.
Sur une note connexe, vous n'avez pas besoin d'utiliser trois stringstream
pour atteindre votre objectif. Vous pouvez simplement en utiliser un:
std::stringstream t;
t.precision(2);
t << fixed << a << '\n' << b << '\n << c << '\n';
std::string out = t.str();