Float über Stringstream ausgeben
-
Nur eine schnelle Frage dazu. Ich möchte extrem kleine Werte, für die die wissenschaftliche Notation mit negativen Exponenten zum Einsatz käme, als Null ausgeben. Soweit ich weiß, muss ich dafür den stringstream auf ios::fixed stellen und eine geeignete Präzision benutzen. Dann werden aber hemmungslos Nullen angehängt, selbst wenn da gar nichts relevantes mehr kommt.
Ich schneide dann manuell diese Nullen ab. Aber ich frage mich, ob es auch eine eingebaute, möglicherweise schnellere Art gibt, auf dieses Format zu kommen.
-
Warum castest nicht einfach ein int auf deine float-variable?
if(floatvariable < 0,01) floatvariable = (int) floatvariable
-
oder nimm alternativ die floor-fkt aus <cmath>
http://www.sql-und-xml.de/server-daten/sql-befehle/floor.html
-
nur ein vorschlag schrieb:
oder nimm alternativ die floor-fkt aus <cmath>
http://www.sql-und-xml.de/server-daten/sql-befehle/floor.html
gruml, hier ein brauchbarer link:
http://www.cplusplus.com/reference/clibrary/cmath/floor.html
-
Das habe ich mal ausprobiert. Da muss ich natürlich zuerst alles vor dem Komma abschneiden mit modf() und dann nur den Nachkommateil überprüfen. Aber dann kann es wegen der nicht immer ganz genauen internen Darstellung von floats ganz unangenehme Effekte geben.
Ein Beispiel: Ich möchte auf maximal drei Nachkommastellen genau angegeben haben, also müsste bspw. 0.001f noch zulässig sein. Dann erhalte ich allerdings 0.00977 als Ausgabe. Was ziemlich kontraproduktiv ist.
Das Problem habe ich bei der bisherigen Herangehensweise nicht, weil da der Wert des float erstmal ziemlich genau in den stringstream geschrieben wird, bei dem ich dann zeichengenau abschneiden kann.
Zudem kommt halt dazu, dass ich Vor- und Nachkommateil getrennt bearbeiten und wieder zusammenbauen müsste. Das scheint mir also nicht das Gelbe vom Ei zu sein.
-
So gehts nicht?
std::stringstream Stream; Stream.setf(std::ios::fixed); Stream.precision(3);
-
Das ist eine Teillösung. Aber wie gesagt werden dann hinter dem Komma auf jeden Fall drei Nullen geschrieben, und das ist die größte Platzverschwendung, wenn eh nichts neues da steht. (Bsp.: Aus 10.1f wird 10.100) Also muss ich die Nullen manuell abschneiden.