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. Ohnestd::fixedwird mitstd::setprecision( )(undstd::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.44999999999999999Es 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