2010-03-22 5 views
12

Gibt es eine Möglichkeit, die "minimale" Anzahl von Dezimalstellen festzulegen, die ein std :: ostream ausgeben soll?Mindestanzahl von Dezimalstellen für die Genauigkeit von std :: ostream festlegen

Zum Beispiel sagen, dass ich zwei unbekannte Doppel Variablen, die ich drucken möchten (Werte hier aus Gründen der Erläuterung hinzugefügt):

double a = 0; 
double b = 0.123456789; 

Ich kann meine maximale Dezimalgenauigkeit so, dass ich Ausgang b genau eingestellt

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

gibt es eine Möglichkeit, eine „Minimum“ Präzision (eine minimale Anzahl von Dezimalstellen) einzustellen, während die „maximale“ Präzision beibehalten wird, so daß

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

Ausbeuten

0.0 
0.123456789 

nicht

0 
0.123456789 

?

Danke! Phil


die kurze Antwort ist "Nein". Der Stream hat nur eine Genauigkeitseinstellung, wobei keine Möglichkeit besteht, zwischen maximaler und minimaler Genauigkeit zu unterscheiden. Vielen Dank für Ihre großzügige Beratung!

+0

Lesen Sie die Frage sorgfältig durch. Phil will eine MINIMUM von 1 Stelle der Genauigkeit nach dem Dezimalpunkt, aber mehr, wenn es nicht Nullstellen gibt. – Oddthinking

+1

@Phil: Sie könnten http://stackoverflow.com/questions/2475642/how-to-achieve-the-following-c-output-formatting hilfreich finden. –

+0

Danke Roger. Das ist sehr hilfreich. Ihr Formatierungsbeispiel sieht nach dem richtigen Weg aus. –

Antwort

0

Ich glaube nicht, es gibt einen Weg zu erreichen, was Sie ohne bitten die Zahl in einen String (mit hohen Präzision) zu drehen, und die nachfolgenden Nullen Abstreifen.

Dies ist angemessen, weil nur weil es abschließende Nullen gibt nicht bedeutet, dass es keine Genauigkeit gibt, und die Laufzeit kann das nicht sagen.

Zum Beispiel, wenn ich das Gewicht eines Objekts mit einem billigen Maßstab messen, kann es 1,0 kg sein.

Wenn ich es mit einer hochgenauen Waage wäge, kann es 1,00000 kg sein. Nur weil es abschließende Nullen gibt, heißt das nicht, dass die Genauigkeit verworfen werden sollte.

+0

+1, obwohl es mir immer noch unklar ist, was er genau will, jenseits von Null ist genau "0.0". –

+1

Nichts mehr als das, Roger. Ich habe eine Anforderung, dass floats oder double im Ausgabestrom mit einer Dezimalstelle dargestellt werden, und ich suche nur nach einer Möglichkeit, dies elegant zu machen, ohne die Genauigkeitsgenauigkeit anzugeben, auf die sich Oddthinking bezieht. Daher sollte 0 als 0.0 dargestellt werden, nicht 0.0000 ... –

+0

@Phil: Was ist mit 0.12, wird als "0.120000" ausgegeben? Warum ist "0.000000" nicht in Ordnung? (Genau welche Anforderung scheitert es?) –

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

Verwendet nach der festgelegten Präzision behoben.

Edit: Das ist, was Sie wollen. Es würde die Genauigkeit basierend auf d ändern.

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

Danke Sameer. Das setzt jedoch voraus, dass ich vorher weiß, dass d = 0 ist. Gibt es eine Lösung für ein beliebiges d, das "0.0" drucken würde, wenn d = 0, aber "0.123456789" wenn d = 0.123456789? –

+0

@Phil: Der Stream hat nur eine Genauigkeitseinstellung. Sie könnten den Wert überprüfen, bevor Sie ihn ausgeben, und dann "0.0" ausgeben (beachten Sie, dass es sich um ein String-Literal handelt, nicht um ein Doppel). –

+0

Sie können so etwas tun. cout << setprecision (d?9: 1) << fest << d << endl; – Sameer