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
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);
}
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.
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
Ich weiß nicht, wie Hacky dies aber ist:
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
.
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 :(
Ist es nicht eine schlechte Idee verdoppelt zu vergleichen? "Wenn (d-Boden (d) == 0.0)" ? – himself
@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. –