Kürzen von überflüssigen Nullen (float)



  • Hello Allerseits !

    Ich schreibe zur Zeit an einem kleinen Berechnungsprogramm, das großen Wert
    auf Genauigkeit legt, d.h. eine Zahl 3.3243 soll auch diese sein und nicht
    einfach mit printf("%.2f",zahl); abgeschnitten werden.
    Meine Frage ist also, wie es möglich ist aus 3.324300 eine 3.3243 zu machen genauso wie aus 5.000000 eine 5. Es geht mir dabei um Lesbarkeit und Genauigkeit.

    Also die "überflüssigen" Nullen elimnieren.

    Ich hoffe ihr könnt mir helfen!

    gruß



  • Ich kann mich irren, aber macht printf("%f",zahl) (ohne Stellenangabe) nicht genau, was du willst?



  • Nein Leider nicht, man bekommt dann alle Stellen angezeigt.



  • Ein wenig schmutzig, aber printf("%g",zahl); macht das.



  • Das scheint zu funktionieren, Danke! ... Wieso eigentlich schmutzig ?



  • Ungenau und funktioniert nur bei einem bestimmten Zahlenbereich ohne Anzeige von Exponent/Mantisse.



  • nun ja, du könntest genau so die feldbreite angeben...

    printf("%5.2f €", zahl);
    

    die ausgabe würde bei einem preis von € 12,45 so erfolgen:

    12.45 €
    

    möchtest du es aber linksbündig haben, so erfolgt es so (kann erfolgen):

    printf("%-5.2f €", zahl);
    

    Ausgabe:

    12.45 €
    


  • ioBen schrieb:

    Hello Allerseits !

    Ich schreibe zur Zeit an einem kleinen Berechnungsprogramm, das großen Wert
    auf Genauigkeit legt, d.h. eine Zahl 3.3243 soll auch diese sein und nicht
    einfach mit printf("%.2f",zahl); abgeschnitten werden.
    Meine Frage ist also, wie es möglich ist aus 3.324300 eine 3.3243 zu machen genauso wie aus 5.000000 eine 5. Es geht mir dabei um Lesbarkeit und Genauigkeit.

    Also die "überflüssigen" Nullen elimnieren.

    Ich hoffe ihr könnt mir helfen!

    gruß

    Die Darstellungen 3.1 und 3.100000 repräsentieren genau dieselbe Zahl. Ich verstehe also deine Frage nicht, wie das eine "genauer" sein soll als das andere.

    Intern werden die Zahlen sowieso anders gespeichert. Das Anfügen von überflüssigen Nullen ist eine reine Ausgabeeigenschaft von printf, aber du willst das "Problem" nicht mit printf lösen 😕



  • Nimm sprintf und geh den String von hinten durch ob du Nullen findest.



  • Wenn es auf Genauigkeit ankommt, kannst du den ANSI C Datentyp long double probieren, und falls dein Compiler sizeof(long double)>sizeof(double) anbietet, bringt das auch was.
    Der Formatspezifizierer für long double ist "%Lf".



  • Das Problem ist unter Anderem auch, dass diese ganzen Fließkommatypen keine absolute Genauigkeit haben, da sie binär repräsentiert werden. Daher kann es durchaus sein, dass 3.2 intern 3.20000000000023498712378034512347893459870281 usw. ist. Die Print-Funktionen können also nicht wissen, wo sie abschneiden müssen, und beim Abschätzen gelänge man schnell in einen undefinierten "Ungefähr-Bereich". Daher wird vom Programmierer eine Nachkommastellenzahl verlangt, ansonsten wird der Defaultwert genommen. Warum dort die abschließenden Nullen nicht abgeschnitten werden, könnte zum einen Performancegründe haben oder den Grund, dass es nicht danach aussieht, als sei dieser Wert genau. In C++ schneiden die stringstreams die schließenden Nullen ab, in C wirst du dir wohl mit einer eigenen Funktion behelfen müssen.


Anmelden zum Antworten