2010-03-22 9 views
12

Existe-t-il un moyen de définir le nombre "minimum" de décimales qu'un std :: ostream va générer?Définition du nombre minimal de décimales pour la précision de std :: ostream

Par exemple, dire que j'ai deux variables doubles inconnues que je veux imprimer (valeurs ajoutées ici pour titre d'illustration):

double a = 0; 
double b = 0.123456789; 

je peux mettre ma précision décimale maximale de sorte que la sortie I b exactement

std::cout << std::setprecision(9) << b << std::endl; 
>>> 0.123456789 

y at-il un moyen de définir une précision « minimum » (un nombre minimum de décimales), tout en conservant la précision « maximum », de sorte que

std::cout << a << std::endl << b << std::endl; 

rendements

0.0 
0.123456789 

pas

0 
0.123456789 

?

Merci! Phil


la réponse courte à cette question est "Non". Le flux n'a qu'un seul réglage de précision, sans possibilité de différencier la précision maximale et minimale. Merci à tous pour vos conseils généreux!

+0

Lisez attentivement la question. Phil veut un MINIMUM de 1 chiffre de précision après le point décimal, mais plus s'il y a des chiffres non-zéro. – Oddthinking

+1

@Phil: Vous trouverez peut-être http://stackoverflow.com/questions/2475642/how-to-achieve-the-following-c-output-formatting utile. –

+0

Merci Roger. C'est très utile. Votre exemple de formateur ressemble à la bonne façon de procéder. –

Répondre

0

Je ne pense pas qu'il y ait un moyen d'atteindre ce que vous demandez sans tourner le numéro dans une chaîne (avec une grande précision), et dépouillant les zéros de fin.

Ceci est approprié, car le fait qu'il y ait des zéros de fin ne signifie pas qu'il n'y a pas de précision, et le temps d'exécution ne peut pas le dire. Par exemple, si je mesure le poids d'un objet à bas prix, il peut être de 1,0 kg. Si je le pèse avec une balance de haute précision, il peut atteindre 1,00 kg. Tout simplement parce qu'il y a des zéros à la fin, cela ne veut pas dire que l'exactitude devrait être écartée.

+0

+1, bien qu'il ne me soit toujours pas clair ce qu'il veut exactement, au-delà de zéro étant exactement "0.0". –

+1

Rien de plus que ça, Roger. J'ai besoin que les floats ou les doubles soient représentés dans le flux de sortie avec une décimale et je cherche juste un moyen de le faire avec élégance sans impliquer le genre de précision d'exactitude auquel Oddthinking se réfère ci-dessus. Donc 0 devrait être représenté par 0,0, pas par 0,0000 ... –

+0

@Phil: Qu'en est-il de 0.12, est-ce que la sortie est "0.120000" d'accord? Pourquoi "0.000000" n'est pas correct? (Exactement à quelle exigence échoue-t-il?) –

2
cout << setprecision(1) << fixed << d << endl; 

Utilisé après la définition du paramètre.

Modifier: C'est ce que vous voulez. Cela changerait la précision en fonction de d.

cout << setprecision(d?9:1) << fixed << d << endl; 
+0

Merci Sameer. Cependant cela suppose que je sache d'avance que d = 0. Y a-t-il une solution pour un d arbitraire qui afficherait "0.0" si d = 0, mais "0.123456789" si d = 0.123456789? –

+0

@Phil: Le flux n'a qu'un seul paramètre de précision. Vous pouvez vérifier la valeur avant de la sortir, et sortir votre "0.0" 'alors (notez que c'est un littéral de chaîne, pas un double). –

+0

Vous pouvez faire quelque chose comme ça. cout << setprecision (d?9: 1) << fixe << d << endl; – Sameer

Questions connexes