Double in String mit fester Breite umwandeln

Double in String mit fester Breite umwandeln

Ich möchte ein Double in einen String mit fester Breite umwandeln.

Wenn die Breite 10 ist, dann möchte ich, dass der doppelte Wert auf diese Breite gerundet wird.

Beispiel:Wenn value =102.121323435345 und width 10 ist, dann sollte dieser Wert

sein
position==>        0123456789       
           value = 102.121323

Ich kann dies mit snprintf erreichen, aber ich suche nach einem nativen C++-Code, um dasselbe zu tun.


char buf[125];
snprint(buf, width, "%.6f", value);

Ich habe versucht, das Folgende zu verwenden, aber es hilft mir nicht viel,

 
std::ostringstream oss;
oss &lt&lt std::fixed &lt&lt std::setw(10) &lt&lt std::precision(6) &lt&lt value;

std::setw garantiert die Mindestbreite für den Wert und wenn der Wert größer als die Breitengröße ist, werden die Werte nicht gerundet.

Danke.

Sie können die Funktionen osteram::width und ostream::precision verwenden, um Ihr Ziel wie folgt zu erreichen

std::ostringstream out;
out.width(10);
out.precision(10);
out << 123.12345678910111213;

Es werden zwar keine Nullen nach dem Punkt hinzugefügt, um die Breite zu berücksichtigen, aber es werden Leerzeichen (oder ein beliebiges Zeichen Ihrer Wahl) vor der Zahl hinzugefügt. Sie erhalten also „102“ oder „0000000102“ (wenn Sie out.fill(‘0‘);) anstelle von „102.000000“ aufrufen, wenn Sie 102 als Eingabewert übergeben.

Wie wäre es mit einer lexikalischen Besetzung?

double x = 102.1213239999;
std::cout << boost::lexical_cast<std::string>(x).substr(0,10);

Es ist nicht genau das, wonach Sie gefragt haben. Ich habe nur versucht, über den Tellerrand hinauszuschauen.
Sie können sich auch diese Frage ansehen, um eine Diskussion über Formatierungsunterschiede zwischen C und C++ zu erhalten, und die Boost-Formatbibliothek ansehen

Ist es das was du willst? Hier berechnen wir die verfügbare Genauigkeit und stellen Ostream entsprechend ein.

    #include <iostream>
    #include <iomanip>

    using namespace std;

    int main(int argc, char* argv[])
    {
    // Input
    double value =  102.1213239999;
    // Calculate limits
    int digits = ( (value<1) ? 1 : int(1+log10(double(abs(value)))) );
    int width = 10;
    int precision = (((width-digits-1)>=0) ? (width-digits-1):0);

    // Display
    cout.setf(ios::fixed);
    cout.precision(precision);
    cout<<setw(10)<<value<<endl;


    return 0;

    }
    OUTPUT: 102.121324

Übrigens, wenn Sie eine Wagenladung von Möglichkeiten haben möchten, Ziffern zu berechnen , so geht's.

int main() {
    double x=3.543732;
    cout << to_string(x).substr(0,5);
    return 0;
}