2009-12-07 12 views
8

Ich habe eine Reihe von Fließkommazahlen, wo Daten mit unterschiedlichen Dezimalstellen gespeichert werden, so einige sind 123.40000, , 123.45600 ... jetzt, wenn ich diese Werte in der Zeichenfolge ohne die 0s in drucken möchten das Ende in printf(), so dass sie 123.4, 123.45, 123.456 sind, ohne diese 0s am Ende. Ist das möglich? Wenn das so ist, wie?Fließkommaformatierung in printf()

Antwort

18

die% g Formatierer verwenden:

printf("%g", 123.4000); 

Drucke

123,4

Nachfolgende Nullen entfernt sind, aber leider ist, so dass die Hinter Dezimalpunkt wenn der Bruchteil gleich Null ist. Ich weiß nicht, ob es tatsächlich eine Möglichkeit zu tun, was ist mit Ihnen direkt printf (weiß) - Ich denke, so etwas wie dies ist wahrscheinlich die beste Wahl:

#include <stdio.h> 
#include <math.h> 

void print(FILE * f, double d) { 
    if (d - floor(d) == 0.0) { 
     fprintf(f, "%g.", d); 
    } 
    else { 
     fprintf(f, "%g", d); 
    } 
} 

int main() { 
    print(stdout, 12.0); 
    print(stdout, 12.300); 
} 
+1

Ist es nicht eine schlechte Idee verdoppelt zu vergleichen? "Wenn (d-Boden (d) == 0.0)" ? – himself

+1

@hisself Nein, es ist in Ordnung, wenn Sie wissen, was Sie tun. "Vergleichen Sie nie Gleitkommazahlen für' == '" ist nur eine Annäherung für die einfachen. –

0

Use% g -

Drucken ein Double in normaler oder exponentieller Notation, je nachdem, was für seine Größe geeigneter ist. 'g' verwendet Kleinbuchstaben, 'G' verwendet Großbuchstaben. Dieser Typ unterscheidet sich geringfügig von der Festkomma-Notation, da unwesentliche Nullen rechts vom Dezimalpunkt nicht enthalten sind. Außerdem ist der Dezimalpunkt nicht in ganzen Zahlen enthalten.

+0

nur eine kleine Abfrage, was ist, wenn ich die abschließenden Nullen entfernen möchte aber die Dezimalzahl in ganzen Zahlen, wie 124.00000 ist 123. – sfactor

3

Ich weiß nicht, wie Hacky dies aber ist:

http://codepad.org/e3Q3pUNd

float f = 124.000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

Returns 124.0.

float f = 124.123000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

Rückgabe 124.123.

0

Drucken Sie auf einen Puffer (groß genug). Drucken Sie den Puffer ... und wenn die im Puffer ist, drucken Sie einen Punkt.

char buf[100]; 
sprintf(buf, "%g", val); 
printf("%s", buf); 
if (strchr(buf, '.') == NULL) putchar('.'); 

bearbeiten

Die Norm legt die # Flagge:

# Das Ergebnis auf eine `` alternative Form umgewandelt wird ''. [...] Bei Konvertierungen a, A, e, E, f, F, g und G enthält das Ergebnis der Konvertierung einer Gleitkommazahl immer ein Dezimalzeichen, auch wenn keine Ziffern auf folgen . [...] Bei g- und G-Konvertierungen werden nachfolgende Nullen nicht aus dem Ergebnis entfernt. [...]

... aber Sie bekommen die nachgestellten Nullen :(