float Anzahl Stellen vor Komma



  • Hallo,

    wie kann man die Anzahl der Stellen vor dem Komma eines floats bekommen? Wie kann man einen float auf n Nachkommastellen runden?

    Danke!



  • Die Anzahl der Vorkommastellen erhält man mit

    int vk = int( log10( abs( zahl ) ) ) + 1; // erfordert #include <cmath>
    

    Runden beim Ausgeben von Fließkommazahlen kann man mit den Manipulatoren fixed und setprecision - z.B.:

    double pi = acos( -1.0 ); // erfordert #include <cmath>
        cout << fixed << setprecision(4); // 4 Nachkommastellen für alle Fließkommazahlen
        cout << "Pi = " << setw(8) << pi << endl;
    

    erfordert #include <iomanip>

    Gruß
    Werner



  • Sowas?

    a) 10.1635 -> 2 Stellen vor dem Komma
    b) 10.1635 runden auf 3 Stellen -> 10.164

    a)
    float f = 10.1635;
    int i = static_cast<int>(f);
    

    Nun hat sich das Problem darauf reduziert festzustellen, wieviel Stellen eine Integerzahl hat. Sukzessives anwenden von div 10 ( / 10) sollte das gewueschte erziehlen.

    b)
    float f = 10.1635;
    float r = static_cast<float>( static_cast<int>(f * 10^3 + 0.5) );
    

    Das rundet die gegebene float-Zahl auf 3 Stellen nach dem Komma. Es ist leicht auf n zu verallgemeinern. Auch solltest du bei negativen Zahlen aufpassen und entsprechend dein Programm anpassen.



  • Ich habe mal die Forensuche bemueht und ueberraschend viele Treffer erhalten. Solltest du auch machen! 😡



  • knivil schrieb:

    a)
    float f = 10.1635;
    int i = static_cast<int>(f);
    

    [...]

    b)
    float f = 10.1635;
    float r = static_cast<float>( static_cast<int>(f * 10^3 + 0.5) );
    

    Diese beiden Code-Stücke funktionieren nur selten korrekt. Beide gehen schief, sobald die Fließkomma-Zahl zu groß ist für einen int, was schnell vorkommt.



  • knivil schrieb:

    Ich habe mal die Forensuche bemueht und ueberraschend viele Treffer erhalten. Solltest du auch machen! 😡

    Kurze Frage dazu:

    Mit welchen Suchbegriffen denn? Versuche es nämlich auch gerade, leider nur mit mäßigem Erfolg!

    Ciao



  • @knivil
    Dein Rundungscode ist falsch. Schau bitte nochmal nach was der operator ^ macht (jedenfalls keine Potenzierung).



  • Um zu runden, kann man die Funktionen floor() und ceil() aus <cmath> verwenden. Bei Bedarf passt man die Zahl durch Multiplikation/Division mit Zehnerpotenzen vorher und nachher an.



  • Schau bitte nochmal nach was der operator ^ macht (jedenfalls keine Potenzierung)

    Ja genau und das b) im Code funktioniert so auch nicht etc. ... Ich bin net bloed.Eigentlich sollte es 10 hoch 3 oder allgemeiner 10 hoch x ausdruecken, aber du kannst es auch gern als copy-paste-Sperre interpretieren.


Anmelden zum Antworten