web-dev-qa-db-fra.com

Points décimaux avec std :: stringstream?

J'ai un tas d'entiers que je mets dans stringstreams. Maintenant, je veux changer les stringstreams en strings tout en gardant une précision constante avec les strings. 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

27
noobcpp

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();
45
templatetypedef