double runden



  • Hallo ,

    ich möchte einen double auf 4 Nachkommastellen runden.
    Das runden klappt auch , aber das Endergebnis hat dat sehr viele
    nachkommastellen , die mit Nullen ausgefüllt sind.
    Wie kriege ich nur 4 Nachkommastellen ?

    double x = 12.3400000001; 
    unsigned int nStellen =4 ; 
    double y = Round( x, nStellen); 
    
    double CTestDoc::Round( double zahl, unsigned int nStellen ) 
    { 
    long mul = potenzieren( 10 , nStellen ); 
    zahl*= mul; 
    if( zahl>0 ){ zahl += 0.5;} 
    else{ zahl-=0.5;} 
    long x = static_cast<long>(zahl); 
    zahl = 0; 
    zahl = static_cast<double>( x); 
    
    zahl/=mul; 
    
    return zahl; 
    } 
    
    long CTestDoc::potenzieren(int basis, int exponent) 
    { 
    int erg=1; 
    for(int i=0; i<exponent; ++i){ 
    erg*= basis; 
    } 
    return erg; 
    }
    

    Gruß, Elke



  • Elke100 schrieb:

    Das runden klappt auch , aber das Endergebnis hat dat sehr viele
    nachkommastellen, die mit Nullen ausgefüllt sind.

    Intern (im Speicher) werden diese Nullen auch immer existieren. Runden heißt nicht, dass da plötzlich Bits verschwinden. 😉

    Elke100 schrieb:

    Wie kriege ich nur 4 Nachkommastellen?

    Bei der Ausgabe:

    std::cout.precision( 4 );
    std::cout << std::fixed << 12.3400000001 << std::endl;
    

    cheers, Swordfish

    PS: cpp-Tags sind was Tolles 😉



  • Wenn du mit cout arbeitest, könnte dir setprecision helfen:

    cout << setprecision(4) << f << endl;
    


  • Danke für eure Antworten !

    Aber mir geht es nicht drum , die Zahl als Meldung auszugeben.
    Ich schreibe die Zahl in eine andere Struktur , die auch als
    xml ausgegeben werden kann.
    Und die Frage ist , wir kann ich nur die 4 Nachkommastellen
    in die andere Struktur schreiben.

    Danke.

    Elke



  • Gar nicht.



  • lagalopex schrieb:

    Wenn du mit cout arbeitest, könnte dir setprecision helfen:

    cout << setprecision(4) << f << endl;
    

    Für std::setprecision( ) musst Du <iomanip> einbinden. Ohne std::fixed wird mit std::setprecision( ) (und std::ostream::precision( ) ) die Gesamtbreite festgelegt, nicht nur die Anzahl der Nachkommastellen.

    Elke100 schrieb:

    Ich schreibe die Zahl in eine andere Struktur , die auch als
    xml ausgegeben werden kann.

    Wie sieht diese Struktur denn aus? Wie serialisierst Du sie?

    cheers, Swordfish



  • Hallo ,

    habe noch ein Problem festgestellt.

    Wenn ich die Zahl : 12.44999999999999999 nehme , dann bekomme ich
    nach der folgenden Codezeile :

    zahl = static_cast<double>( x);
    

    zahl = 124500 Was auch richtig ist.

    Bei der nächsten Codezeile :

    zahl/=mul;
    

    bekomme ich als Ergebnis wieder meine ursprüngliche Zahl:
    zahl =12.44999999999999999

    Es ist doch zum Verzweifeln !!!!

    Was mache ich falsch ?

    Gruß , Elke



  • komma um 4 Stellen nach links schieben, in einen Integer umwandeln, wieder zurück in double und komma wieder nach rechts schieben

    du könntest das ganze auch in nen String umwandeln, womit sich auch recht einfach alle nicht benötigten Zeichen entfernen lassen

    mal etwas mehr Kreativität zeigen ^^



  • Hallo zwutz,

    und was soll ich tun , wenn ich
    den Wert in String umwandle ?
    Nullen entfernen ?

    Wenn ich wieder zu double zurückkehre habe ich wieder alles beim Alten.
    Ausserdem , arbeite ich nicht mit Spieldaten . Es gibt auch so Begriffe wie Typsicherheit . Ich kann nicht z.B. Preise einfach in verschieden Typen
    umwandeln und Zeichen entfernen !
    Mein Chef nennt sieht es bestimmt nicht als kreativ an . 🙂

    Grüße, Elke



  • Elke100 schrieb:

    Es gibt auch so Begriffe wie Typsicherheit. Ich kann nicht z.B. Preise einfach in verschieden Typen umwandeln und Zeichen entfernen!

    Geldbeträge speichert man auch nicht als double ...

    Swordfish schrieb:

    Wie sieht diese Struktur denn aus? Wie serialisierst Du sie?

    cheers, Swordfish



  • Hallo Swordfish

    Geldbeträge speichert man auch nicht als double...

    Ja natürlich . Wir haben dafür auch Money-Variablen Typen.
    Problem ist , wir benutzen zum Versenden der Daten ein Fremdframework ,
    dass nur float und double kennt .

    Wie sieht diese Struktur denn aus? Wie serialisierst Du sie?

    das ist eine ObjektStruktur , die auf Klassen aus dem Fremdframework basiert

    Und ich muss einfach einen double in diese Striuktur setzen.

    Gruß , Elke


Anmelden zum Antworten