# Double-Wert auf zwei Stellen Runden



## MAN (8. April 2004)

Hallo,

wie kann ich denn einen ganz normalen double-Wert auf zwei Stellen hinter dem Komma runden? Am besten automatisch auf und ab?


mfG

MAN

P.S.: falls es so einen Thread schon gibt, habe ich ihn leider über die Suchfunktion ned gefunden, sry


----------



## Thomas Pinske (8. April 2004)

Hallo MAN,

Du musst den double-Wert zuerst mal 100 nehmen, den Restwert abschneiden und wieder durch 100 teilen:


```
double x = 12345.6789;
x = (int)(x*100+0.5)/100.0;
```

Nach der Umwandlung hat x den Wert 12345.68. Die Addition sorgt dafür, dass das Ergebnis richtig gerundet ist und mit dem Cast werden die übrigen Nachkommastellen abgeschnitten.

Grüße Thomas


----------



## MAN (8. April 2004)

Vielen Dank!

Hatte auch schon überlegt irgendwie mit 0.5 dazurechnen, aber das ging ja nicht mit den 2 kommastellen... aber wenn man das *100 macht gehts - super!


mfG

MAN


----------



## c-hilgert (21. Juni 2004)

Das klappt wunderbar mit den zwei kommastellen. Aber was mache ich wenn ich nur eine Kommastelle habe? Wie kann ich die zweite Kommastelle eine Null einfügen?


----------



## Endurion (21. Juni 2004)

Äh, keine zweite Kommastelle IST eine 0.

Du meinst, jetzt für die Ausgabe? Das kommt dann auf die Funktion, mit der du das double ausgibts, an.

Bei streams gibt's ein setprecision, bei w(s)printf gibt's das "%.2f" für 2 Nachkommastellen.


----------



## c-hilgert (21. Juni 2004)

Was ist denn ein Stream?
Ich habe den Quellcode von oben genommen.
Ich brauche die Ausgabe für eine Quittung und wenn da nur als Gesamtbetrag 5,2 steht ist das schon e. Da sollte 5,20 oder sowas stehen. Wie bekomme ich das hin?


----------



## Endurion (21. Juni 2004)

Wie übergibst du denn den Betrag zum Ausdrucken?

Als const char* oder CString oder std::string?

Bei const char* nimm wsprintf mit %d.02d
Bei CString dasselbe mit Format und %.02d
Bei std::string entweder über string-streams mit setprecision oder über ein char-array als Vermittler.

double x = 12.3

char   szBetrag[200];

wsprintf( szBetrag, "%d.%02d", (int)x, (int)( x * 100 ) % 100 );

(int)( x * 100 ) % 100 sieht etwas kryptisch aus, ist aber einfach erklärt:

* 100, weil du ja die letzten beiden Stellen willst. 
Der Cast auf int bewirkt ein Abschneiden der Nachkommastellen.
% 100, damit nur die letzten beiden Stellen ausgegeben werden (der Rest einer Division durch 100).
Das %02d gibt die Nachkommastellen mit zwei Stellen aus, die vorne mit Nullen gefüllt werden. 

Beispiel:
Ein 12.3 wird zu 1230 umgerechnet, die letzten beiden Stellen ergeben 30.
Ein 11.07 wird zu 1107 umgerechnet, die letzten beiden Stellen ergeben 07.


----------



## c-hilgert (21. Juni 2004)

OK habe ich verstanden und funktioniert auch. Besser gesagt habe es ein wenig anders angewandt aber es funktioniert. Gibt es jetzt auch noch ne Möglichkeit statt einen Punkt ein Komma ausgeben zulassen?
15.02 ist das Ergebnis soll aber als 15,02 dargestellt werden?


----------



## Kachelator (21. Juni 2004)

Das geht möglicherweise mit einem ostream, aber ich fürchte, dazu musst du es erst in einen String schreiben und dann darin den Punkt '.' durch ein Komma ',' ersetzen.


----------



## Endurion (21. Juni 2004)

Wenn du eins der printf's (wsprintf, sprintf, irgendwas_printf) oder CString's Format verwendet hast, dann:

"%d.%02d" ist eine Art Maske. Ändere einfach den . auf ,.
Du kannst da auch beliebige Texte einsetzen, nur das %-Zeichen ist ein Platzhalter für spezielle Kommandos wie z. Bsp. Zahl einsetzen usw.


----------



## Kachelator (21. Juni 2004)

Coole Sache! Habe ich noch gar nicht probiert.


----------

