2016-06-21 12 views
-1

Ich deklariere eine Variable double MyDouble;.printf verdoppelt ohne nachgestellte Nullen

Wenn ich dann MyDouble = 1000.0/3.0; und dann printf("%g", MyDouble); gibt gibt 333,333, so dass es etwas Präzision verloren hat.

Wenn ich printf("%lf", MyDouble); verwende, bekomme ich die Präzision.

Die untere Seite ist, wenn ich jetzt MyDouble = 5.0/2.0; setze und printf("%lf", MyDouble); benutze, bekomme ich 2.500000, also schleppende Nullen.

Als ein allgemeiner Fall, wie kann ich die Genauigkeit ohne die abschließenden Nullen haben. Ich könnte das Double auf eine Zeichenkette mit snprintf und dem %lf Format schreiben und dann ein Unterprogramm schreiben, um nachgestellte Nullen zu entfernen, aber es muss einen einfacheren Weg geben.

+1

Link zu std :: printf Dokumentation einschließlich Formatbezeich: http://en.cppreference.com/w/cpp/io/c/fprintf –

+4

Sie entweder wollen, dass viel Präzision oder Sie don t. –

+1

'l' Längenmodifikator hat keine Auswirkung auf' f' Spezifizierer. – jxh

Antwort

0

Sie können versuchen, wie folgt zu vermeiden zero.

double a= 5.0; 
double b = 2.0; 
printf("%.2lf\n", a/b); 
1

Die Genauigkeit der g Konvertierungsspezifizierer die maximale Anzahl von signifikanten Ziffern steuert (siehe C.2011 § 7.21.6.1 ¶ 4). Die Genauigkeit wird durch eine Zahl angegeben, die einem Dezimalpunkt folgt. Es scheint, Sie wollen 9 signifikante Ziffern. Also, versuchen Sie:

printf("%.9g", MyDouble); 
+0

[Demo auf Ideone.] (Http://ideone.com/X09o3i) – jxh

+0

Danke jxh. Dies würde dem% f-Spezifizierer präzisieren, aber keine abschließenden Nullen entfernen. "% .17g" tut was ich brauche, da es die Zahl bis zu den vollen 17 Zeichen formatiert (einschließlich des Dezimalpunkts) und dann unnötige Nullen entfernt. – user1228123

+0

Die Antwort sollte 'g' haben, wie in meinem ersten Satz angegeben. Der Code mit "f" war ein Tippfehler. – jxh