2017-04-19 2 views
0
setzen

Gibt es eine direkte Funktion, um die Dezimalzahl der Zahl einzustellen. Zum Beispiel habe ich 3.14341 und mein Parameter ist 2, so bekomme ich 3.14. Es gibt eine Funktion setprecision, aber es druckt nur das Ergebnis. Außerdem habe ich einen Algorithmus wie folgt gemacht:Dezimalzahlen gemäß Parameter

std::string fixPrecision(std::string const& value, int digits) 
{ 
    std::string num = value; 
    float temp = std::stof(num); 
    float fractpart, intpart; 
    fractpart = modf(temp, &intpart); 
    int a = (int)(fractpart * pow(10,digits)); 
    double last = intpart + a*(pow(0.1 , digits)); 
    return std::to_string(last); 
} 

Es funktioniert gut. Ich bekomme, was ich will, aber ich muss es in eine Zeichenfolge konvertieren, so dass das Ergebnis 123.120000 anstelle von 123.12 ist.

Ich könnte sicher einige Hilfe hier verwenden. Danke im Voraus.

Edit: Es ist keine doppelte Frage, weil meine Funktion Integer und Zahlen mit String-Format zurückgeben muss. Danke noch einmal.

+0

Warum möchten Sie die Zahl intern runden. Normalerweise müssen Sie es nur runden, wenn Sie es anzeigen. Normalerweise ist es nicht nötig, die Präzision loszuwerden. Wenn Sie mit etwas wie Währung arbeiten, sollten Sie Integer/eine Bibliothek mit fester Genauigkeit verwenden. – NathanOliver

+0

Dies ist meine Aufgabe in der Firma und Zahlen sollten mit Strings gesendet werden Danke für die Antwort –

+0

Dies kann mit einem 'std :: stringstream' und Manipulatoren wie' std :: fixed' und 'std :: setprecision' erreicht werden. Sie sollten jedoch in Erwägung ziehen, die Zeichenfolge direkt zu bearbeiten. Die Verwendung eines mittleren "Schwimmers" birgt die Gefahr, dass Ihre Präzision beschädigt wird. –

Antwort

0

Dummkopf von mir. Die Antwort ist so einfach. Ich habe viele Dinge unnötig ...

std::string fixPrecision(std::string const& value, int digits) 
{ 
    auto pos = value.find("."); 
    if(pos != std::string::npos) 
    return value.substr(0, pos+digits+1); 
    return value; 
} 
0

nicht genau, aber man kann die Präzision mit std :: set setprecision

definieren eine Methode:

void printWithPrecision(const double value, unsigned decimalPlaces) 
{ 
    std::cout << "A Double with " << decimalPlaces <<" decimal places: "<<std::setprecision(decimalPlaces) << value << std::endl; 
} 

und nennen es mag:

double d = 7987.12354689765416; 

for (auto x = 0; x<10; x++) 
{ 
    printWithPrecision(d, x); 
} 

vergessen Sie nicht zu schließen Sie den Input-Output-Manipulator ein:

#include <iomanip> 
+0

danke für die Antwort, aber ich will nicht Drucken Sie es stattdessen, ich möchte es zuweisen. –

+0

aber das ist ein Doppel, Sie können nur nicht die 53 Bits ändern, die es definieren (siehe: https://en.wikipedia.org/wiki/IEEE_754-2008) –

+0

möglicherweise gibt es eine String-Funktion (nachdem ich in Zeichenfolge konvertieren) dafür... –