double mit 2 nachkommastellen
-
hallo,
habe mit folgendem code ein problem:
std::string value = "1.555"; std::stringstream ss(std::stringstream::in | std::stringstream::out); ss.precision(2); ss.setf(std::ios::fixed, std::ios::floatfield); std::ios::fmtflags flags = ss.flags(); flags |= std::ios::showpoint; ss.setf(flags); ss.str(value); double doubleValue; ss << std::fixed << std::setprecision(2) << value; ss >> doubleValue; std::cout << doubleValue << std::endl;
erwarten würde ich eine ausgabe mit "1.55",
erhalte aber trotzdem "1.555".was mache ich falsch?
lg
QuornJulio
-
QuornJulio schrieb:
was mache ich falsch?
Zeile 1:
double value = 1.555;
-
Werner_logoff schrieb:
Zeile 1:
double value = 1.555;
Wie meinst du das? Er will doch am Anfang ein String und nicht double haben.
@Julio:
1. Du brauchst fixed nur einmal im gesamten Programm setzen.
2. Versuch mal, fixed vor dem precision zu setzen.
3. Fürflags |= ...
gibt esstd::ios_base::unsetf
. Dann brauchst du auch die Zeilen 5 und 7 nicht.
4. Lies dir meine Signatur durch.
-
[Rewind] schrieb:
@Julio:
1. Du brauchst fixed nur einmal im gesamten Programm setzen.
2. Versuch mal, fixed vor dem precision zu setzen.
3. Fürflags |= ...
gibt esstd::ios_base::unsetf
. Dann brauchst du auch die Zeilen 5 und 7 nicht.
4. Lies dir meine Signatur durch.Das hört sich doch sehr mystisch an. Oder schlecht ausgedrückt. Jedenfalls:
1. Ungenau. fixed wird auf Objektebene gesetzt. Bei dir klingt das so, als würde einmal setzen dann für alle Streams gelten.
2. Sollte das deiner Meinung nach etwas ändern? Die Reihenfolge hat keine Auswirkung auf Formatflags, diese werden erst ausgewertet, wenn tatsächlich eine Ein-/Ausgabeoperation erfolgt.
3. Du meinst hier wohl setf?
4. Das ist 100% richtig.Den Fehler hat Werner schon genannt: precision wirkt nur auf die Ausgabe von float-Typen.
-
[Rewind] schrieb:
Werner_logoff schrieb:
Zeile 1:
double value = 1.555;
Wie meinst du das? Er will doch am Anfang ein String und nicht double haben.
cout << fixed << setprecision(2) << "1.555";
Erwartest du hier. dass "1.55" ausgegeben wird? Mit anderen Worten, erwartest du, dass fixed und setprecision die Ausgabe eines Strings beeinflussen?
-
1. bezieht sich auf das verwendete ios_base-Objekt (cout). Ich dachte das ist klar.
2. war nur eine Idee. Ich habe erst danach gesehen, wo der Fehler ist.3. Du meinst hier wohl setf?
Ja.
Um durch Werners Antwort auf die Lösung zu kommen, muss man zwischen den Zeilen, die zwischen den Zeilen stehen, lesen.
-
hallo zusammen,
danke erstmal für eure antworten.
double value1 = 1.555 zu double value2 = 1.55 mit precision(2)
funktioniert.ja, ich habe erwartet, daß fixed und setprecision die ausgabe des strings
beeinflussen. ich lag wohl falsch.
(einige beispiele im internet haben mich das annehmen lassen.)ein string wie std::string value = "1.555" zu double funktioniert
schon, allerdings hat precision(2), wie ich feststellen musste,
keine auswirkung.ein double kriege ich leider nicht in die darstellung 1.00 mit precision(2)
erzwungen. die nullen werden immer abgeschnitten. gibt es hierfür eine
lösung?nochmals danke!
gruss
QuornJulio
-
-
hallo,
danke für den link.
ist mir bekannt:
double value = 1.00;cout.precision(2); cout << fixed << value;
allerdings will ich den wert gespeichert haben in einer variablen.
also z.B.:
double xy = 1 => in double value1 = 1.00
double zy = 1.5 => in double value2 = 1.50gruss
QuornJulio
-
doubles speichern den Wert einer Zahl, keine Zeichenketten.
-
hallo,
ich will nicht ein double in einer zeichenkette speichern!
ich will lediglich ein double mit 2 nachkommastellen.zum Beispiel:
double xy = 1 => double value1 = 1.00
double zy = 1.5 => double value2 = 1.50
double za = 1.555 => double value3 = 1.55gruss
QuornJulio
-
QuornJulio schrieb:
double xy = 1 => double value1 = 1.00
double zy = 1.5 => double value2 = 1.50
double za = 1.555 => double value3 = 1.55double value1 = 1; double value2 = 1.5; double value3 = 1.555; std::cout << std::fixed << std::setprecision(2) << value1 << "\n" << value2 << "\n" << value3;
Wurde doch schon erwähnt oder täusche ich mich?
EDIT:
Ausgabe:1.00 1.50 1.55
-
QuornJulio schrieb:
ich den wert gespeichert haben in einer variablen.
also z.B.:
double xy = 1 => in double value1 = 1.00
double zy = 1.5 => in double value2 = 1.50warum?
-
hallo,
ich will den double NICHT! ausgeben auf std::cout, wie bereits oben erwähnt.
ich will werte, siehe oben, in doubles variablen mit nachkommastellen speichern,
auch wenn sie keine nachkommastellen haben.double value = 1;
zu
double _value = 1.00
speichern und NICHT! auf std::cout ausgeben.
gruss
QuornJulio
-
QuornJulio schrieb:
ich will den double NICHT! ausgeben auf std::cout, wie bereits oben erwähnt.
ich will werte, siehe oben, in doubles variablen mit nachkommastellen speichern,
auch wenn sie keine nachkommastellen haben.Nachkommastellen sind lediglich eine Information für den menschlichen Leser. Für den Computer ist die Anzahl der Nachkommastellen egal, also wiederhole ich meine Frage:
daddy_felix schrieb:
warum?
-
QuornJulio schrieb:
double value = 1;
zu
double _value = 1.00
speichern
SeppJ schrieb:
doubles speichern den Wert einer Zahl, keine Zeichenketten.
-
hallo,
ich möchte mich bei allen bedanken, die geantwortet haben.
das problem hat sich erledigt.gruss
QuornJulio
-
Ich hoffe, das hat sich erledigt, weil du verstanden hast, dass 1.000 und 1.0 für den Computer dieselbe Zahl ist und sie sich nur in ihrer Darstellung unterscheiden (wie man's eben auch von der Schule kennt).