2011-02-25 3 views
22

J'ai un tas d'entiers que je mets dans stringstream s. Maintenant, je veux changer les stringstream s dans string s tout en conservant une précision constante avec les string s. Comment ferais-je cela? Je sais que je peux utiliser stringstreams.precision(), mais il ne fonctionne pas pour une raison quelconque:point décimal avec std :: stringstream?

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"; 

sera de retour 5.23\n3.134\n3.0, plutôt que 5.23\n3.13\n3.00

Répondre

43

Je pense que votre problème est que precision() définit la précision utilisée dans les opérations futures d'insertion de flux , pas lors de la génération de la chaîne finale à présenter. C'est, en écrivant

ta << a; 
tb << b; 
tc << c; 

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

vous configurez precision trop tard, comme les trois premières lignes ont déjà converti les nombres à virgule flottante à des 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 déclarations

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

ta << a; 
tb << b; 
tc << c; 

Cela entraînera les écritures dans le stringstream d'utiliser votre précision sur mesure plutôt que les valeurs par défaut existantes.

Cependant, l'effet du modificateur precision n'a de sens 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 fixed ou scientific modificateurs:

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

ta << fixed << a; 
tb << fixed << b; 
tc << fixed << c; 

Cela permet d'afficher correctement le nombre approprié de chiffres.

Sur le même sujet, vous n'avez pas besoin d'utiliser trois stringstream s pour atteindre votre objectif. Vous pouvez simplement utiliser un:

std::stringstream t; 
t.precision(2); 

t << fixed << a << '\n' << b << '\n << c << '\n'; 

std::string out = t.str(); 
+2

merci, mais son ne fonctionne pas. im encore obtenir '3.0' plutôt que' 3.00' – noobcpp

+0

@ noobcpp- Whoops! Mon erreur. Je viens de mentionner ce mis à jour que vous devez utiliser 'fixed' ou' le mode scientific' sur les stringstreams. Essayez de faire ce changement et voyez si cela arrange les choses. – templatetypedef

+0

+1. @noobcpp: Aussi, consultez: http://www.cplusplus.com/reference/iostream/ios_base/precision/ (bien qu'ils disent d'utiliser 0 dans un endroit qui me donne une erreur de compilateur). –