double aufrunden



  • Hi,

    hab leider nochmal ein kleines anliegen:

    bin nicht wirklich fündig geworden (alles funktionen die die zahl teilen und sonst was damit machen...)
    aber, gibt es nicht eine simple funktion der ich sag "runde bis auf 2 nachkomma stellen auf" ?

    bin azwar auf precision gestoßen nur weiß ich nicht wie ich eine variable vom typ double auf zwei nachkomma stellen runden kann..

    http://www.cplusplus.com/reference/iostream/ios_base/precision/

    doubletime = doubletime.precision(12);
    

    wende ich das hier falsch an? gibt mir zumindest einen fehler aus "request for member precision.. which is of non class double"


  • Administrator

    precision schneidet nur ab. Für das Runden gibt es einen Eintrag in der ANSI C FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39342.html

    Grüssli


  • Mod

    precision bezieht sich bloß auf die Ausgabe. Willst du doubles tatsächlich runden, so musst du dir selbst eine Funktion dafür schreiben. Das Runden auf zwei Stellen könnte man machen, indem man mit 100 multipliziert, auf eine ganze Zahl rundet (da findest du Anleitungen für) und dann wieder durch 100 teilst.

    Für das Runden auf eine bestimmte Zahl Stellen gibt es keine fertige Funktion, da die Sonderrolle die du hier dem Zehnersystem zusprichst, in der Mathematik nicht existiert.



  • mhh und ich dachte da gibts ne fertige funktion 🙂

    wasden bitte ist das hier? sehr wirr, versteh ich nicht 🙂 dann bediene ich mich doch lieber der 4.änderung: zusammenfassen 🙂

    // 5. Änderung: Laufzeitverhalten verbessern
    double Round(double Zahl, int Stellen)
    {
        double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 };  // mgl. verlängern
        return floor(Zahl * v[Stellen] + 0.5) / v[Stellen];
    }
    


  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	double a = 23.5452;
    
    	cout << a << endl;
    	cout.precision(4);
    	cout << a << endl;
    
    	return 0;
    }
    

    Dravere schrieb:

    precision schneidet nur ab

    Kann ich so nicht ganz bestaetigen:

    Ausgabe:

    23.5452
    23.55
    

    Aber das nur nebenbei. Wie schon die Vorredner bereits sagten, gibts da bessere Moeglichkeiten



  • precision bezieht sich aber auf die anzahl der nummern wenn ich das richtig sehe? das ist natürlich nur bedingt gut...

    die funktionen in der FAQ sind schon genau das was ich brauche! danke dravere, wo ist die kaffeekasse? 🙂


  • Administrator

    BasicMan01 schrieb:

    Dravere schrieb:

    precision schneidet nur ab

    Kann ich so nicht ganz bestaetigen:

    Ausgabe:

    23.5452
    23.55
    

    Kannst du mir sagen, mit welchem Kompiler das war? Muss ich mal nachprüfen, ist mir ganz neu. Allerdings hatte ich auch noch nicht viel mit precision am Hut 🙂

    taurus schrieb:

    precision bezieht sich aber auf die anzahl der nummern wenn ich das richtig sehe? das ist natürlich nur bedingt gut...

    Kommt darauf an, welche Flags du gesetzt hast:
    http://www.cplusplus.com/reference/iostream/ios_base/precision/

    Grüssli



  • Dravere schrieb:

    Kannst du mir sagen, mit welchem Kompiler das war?

    Aber gerne doch:
    gcc (GCC) 3.4.5 (mingw-vista special)
    [Code::Blocks]

    Gebe mir dein Wissen weiter, wenn es bei anderen anders ist 😃



  • ich warte noch ab ob precision eine möglichkeit ist.. vorerst tuts mal die funktion in der faq 🙂

    schön das ich euch zu noch mehr wissen verhelfe 🙂

    Der Vorteil in der Klugheit besteht darin, dass man sich dumm stellen kann.

    @basicman... wie recht du doch hast 😉


  • Administrator

    BasicMan01 schrieb:

    Gebe mir dein Wissen weiter, wenn es bei anderen anders ist 😃

    Geht mir weniger um andere sondern mehr darum, wie und wo das geregelt ist 😉
    So wie ich das bisher gefunden und überprüft habe, scheint es vom aktuell gesetzten std::locale abzuhängen. Geschrieben wird über num_put::put . Standardmässig sei das C locale gesetzt. Dann wird einfach eine Konvertierung zu printf durchgeführt. Für float und double wird %f verwendet. Wenn man im C Standard nachliest, dann steht in Kapitel 7.19.6.1 Absatz 8 das folgende:

    f,F
    A double argument representing a floating-point number is converted to decimal notation in the style [−]ddd.ddd, where the number of digits after the decimal-point character is equal to the precision specification. If the precision is missing, it is taken as 6; if the precision is zero and the # flag is not specified, no decimal-point character appears. If a decimal-point character appears, at least one digit appears before it. The value is rounded to the appropriate number of digits. ...

    Ich muss unbedingt jetzt denn mal mein Buch über die IOStreams und Locales in C++ durchlesen, bzw. mal Zeit dafür finden 🙂

    Grüssli


Anmelden zum Antworten