Runden und Anzeigen

foxxx

Mitglied
Hallo Leute,

hatte das Problem eine Float-Zahl auf zwei Stellen runden zu müssen. Bin
dann im Internet fündig geworden, habe jetzt jedoch das Problem daß ich z.B.
5.1 in der Ausgabe in meiner Konsolenanwendung (mit Borland 5) auf 5.10 setzen möchte.

Im Moment mach ich das so:

cout << (int)(sqrt(26)*100+0.5)/100.0 << endl;

Der mathematische Trick dahinter ist mir klar, allerdings versteh ich nicht
was das vorangestellte (int) macht. Ohne gehts nicht das hab ich schon
ausprobiert. Im Internet stand was von "Cast". Aber das sagt mir leider gar
nichts.

Daher meine 2 Fragen:

[1] Was bewirkt das (int) und was ist ein Cast?

[2] Wie kann ich erreichen daß der cout 5.10 statt 5.1 ausspuckt?



Viele Grüße
 
Antwort zu 1.) Das (int) ist ein Cast. Ein Cast bewirkt die Umwandlung con einem Datentyp in einen anderen. Hier von eimen "Double floating point" in einen "Integer". Die Verwendung des Cast zum Runden ist a.) sehr unschoener c++ code und b.) besser mit Streammanipulatoren zu erledigen.

Antwort zu 2.) Sehr viel Einfacher mit Streammanipulatoren: Besipiel:
Code:
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main(void) {

    // cout.precision(2);
    cout.setf(ios::fixed);
    cout << setprecision(2) << sqrt(26.0) << endl;

    return 0;
}
Mit cout.setf(ios::fixed) bewirkst du die (fixe) Ausgabe der kompletten angegbenen Genauigkeit (precision). Im cout-Stream kannst du die Nachkommastellen mit setprecision(2) auf zwei Nachkommastellen festlegen. Allgemein kannst du dies auch mit dem hier auskommentierten Befehl: cout.precision(2). Fuer diese Sachen musst duz zusaetzlich zum iostream, das iomanip Headerfile einbinden.
 
zu 1)
das (int) bewirkt eine Umwandlung der nachfolgenden Variable in eine Integer-Variable..
gibts au mit anderen Variablentypen...

Was ich von "Cast" weiß is das es sich dabei au um eine explizite Typkonvertierung handelt...

BSP:
//Umwandlung von XYZ in int
Code:
static_cast<int>(XYZ)
 
Danke ihr beiden!

@ Canuzzi:

Funktioniert wirklich wunderbar. Aber könntest du mir bitte noch folgende Zeile erklären:

cout.setf(ios::fixed);


[1] Es wird die Eigenschaft "setf" von "cout" festgelegt, richtig?
[2] Was passiert in der Klammer? Was heißt "ios"?
[3] In der iostream ist der cout definiert und in der iomanip das "ios"?


Danke für die Hilfe!

Viele Grüße
 
foxxx hat gesagt.:
Danke ihr beiden!

@ Canuzzi:

Funktioniert wirklich wunderbar. Aber könntest du mir bitte noch folgende Zeile erklären:

cout.setf(ios::fixed);


[1] Es wird die Eigenschaft "setf" von "cout" festgelegt, richtig?
setf() ist eine Mehtode des Objekts (der Streamklasse) cout. setf steht fuer set flag und setzt einen Statusbit mit dem du den Formastzustand festlegst. In diesem Fall wird festgelegt, dass der Float immer mit der gleichen festgelegten Genauigkeit ausgegben wird. Du haettest hier noch andere Formatioptionen hinzufuegen koennen, wie ios::hex oder ios::left ... Das wuerde dann so aussehen cout.setf(ios::fixed | ios::left). ios::fixed und ios::left sind Bitfelder, du waehlst beide aus in dem du sie mit dem Binaeren ODER Operator "|" verknuepfst.
[2] Was passiert in der Klammer? Was heißt "ios"?
Das ios ist die Basisklasse der Streamklasse. Eigentlich wird sie nach dem neuen c++ Standard ios_base genannte (also dann cout.setf(ios_base::fixed), was aber noch nicht von allen Kompilern unterstuetzt wird. fixed ist dann ein Parameterwert dieser Klasse..
[3] In der iostream ist der cout definiert und in der iomanip das "ios"?
Das ios ist auch im iostream definiert (was nach meinen vorherigen Aussagen ja auch so sein Muss, da es eine Basisklasse der Streamklasse ist. Mit iomanip werden Streammanipulatoren wie das setprecision() verfügbar.
 
Zuletzt bearbeitet:
Zurück