Nachkommanullen loswerden
-
Hi Forumsbesucher,
bei einem Textausgabeformat muß ich Fließkommazahlen ins File printen. Geht ja mit printf("%Lf", doublezahl) ganz gut (eigentlich fprintf, tut aber nix zur Sache).
Jetzt sind die Werte aber gerastert, was dazu führt, daß zwischen zwei und fünf Nullen am Ende hängen, also z.B. "41.800000" und "71.637500" sind zwei real aufeinanderfolgende Werte. Formalmathematisch ein Maß der Präzision, praktisch nur ein sinnloses Aufblähen der Ausgabedatei.Ich such' und such' in den Dokus zum Formatstring und find' nur Zeugs für Festkommaformate, wo man bestenfalls Nullen dazuschreiben kann, aber nix, Sinnlosnullen wegzulassen.
Mir fällt nur ein, mittels sprintf() erstmal in einen String auszugeben und den von hinten her auf Nullen zu durchsuchen und wegzuknapsen. Dabei ist der Ausgabegenerator eh' schon kein Rennpferd und mit der Methode wird's schnarchig.
Aber vielleicht habe ich nur die falschen Quellen befragt und es gibt eine Primitivmöglichkeit, die ich nicht gesehen habe.
Falls es was gibt: Danke Leute, bitte her damit!
-
Vorgefertigte Methode gibt es nicht. Das sinnvollste wäre wohl als String in nen Buffer schreiben, mittels strchr die erste 0 finden und mit \0 ersetzen.
-
Naja, ganz so einfach ist es nicht - ein Computer rechnet nicht mit Dezimalzahlen, also kann er 41.8 gar nicht genau darstellen. Möglicherweise reicht es für deine Zwecke,
fprintf(datei, "%.5g", zahl);
zu benutzen - der Umwandlungsspezifikator g nimmt als Genauiggkeit die höchstmögliche Zahl angezeigter Nachkommastellen entgegen, keine feste - aber es kann dir damit u.U. passieren, dass er das ganze in e-Notation rausschmeißt (etwa 1.23e6 für 1230000), und niemand kann verhindern, dass du mal 41.79999 oder etwas in der Art bekommst.
-
Janjan schrieb:
Vorgefertigte Methode gibt es nicht. Das sinnvollste wäre wohl als String in nen Buffer schreiben, mittels strchr die erste 0 finden und mit \0 ersetzen.
Uncool, bei "48.0125000" fliegt mir zuviel weg. strchr() ist übrigens auch nicht schneller als die Suche von hinten.
seldon schrieb:
... aber es kann dir damit u.U. passieren, dass er das ganze in e-Notation rausschmeißt (etwa 1.23e6 für 1230000), und niemand kann verhindern, dass du mal 41.79999 oder etwas in der Art bekommst.
Genau das macht's zur Bauchweh- Lösung. Standard- Parser für das Ausgabeformat müssen (sie dürfen nur) keine E- Formatierung verstehen.
Dann schmeiß' ich mal das mit dem Schönheitsfehler so ab, und warte mal, ob jemand motzt ...
-
Ich glaube, das sollte funktionieren:
string ftoa(double d) { ostringstream ss; ss << d; return (ss.str()); }
EDIT: Sorry, wir sind ja im C-Forum