2013-08-06 5 views
5

Ich stehe vor einem Konvertierungsproblem, für das ich Ihre Hilfe möchte. Ich benutze den gcc4-Compiler und bin ziemlich darauf beschränkt, gcc4 zu benutzen.boost lexical Cast String zu verdoppeln

Ich möchte Std :: String in Double konvertieren.

std::string aQuantity = aRate.getQuantity(); 
std::string aAmount = aRate.getAmount(); 

// aAmount = "22.05" 

double dQuantity = boost::lexical_cast<double>(aQuantity); 
double dAmount = boost::lexical_cast<double> (aAmount); 

// dAmount = 22.050000000000001 

By the way, ich habe auch versucht, atof und ich habe immer noch das gleiche Problem. Gibt es eine Möglichkeit istringstream mit setprecission(2) zu verwenden, um den korrekten Wert zu erhalten, der durch aAmount angezeigt wird?

+2

Sie müssen nur mit weniger Genauigkeit drucken. Es wird immer die gleiche Genauigkeit gespeichert. – chris

+1

Die Funktion 'boost :: lexical_cast' verwendet intern' std :: istringstream', um den Wert zu parsen/extrahieren. –

+0

Wenn ich Folgendes tue, bekomme ich stattdessen 22 ... 'std :: stringstream precisionValue; Präzisionswahrscheinlichkeit (2); precisionValue << boost :: lexikalischer_cast (aAmount) << std :: endl; double dAmount; precisionValue >> dMount; // Jetzt bekomme ich 22' – Nostradamus

Antwort

3

Aufgrund der Art der Fließkommawerte ist 22.050000000000001 dem Wert von 22.05 am nächsten, der gespeichert werden kann. Das gleiche würde auftreten, wenn Sie einfach versuchen, 22.05 in einem Doppel zu speichern und es dann zu drucken.

Sie sollten die Genauigkeit für den Ausgabestrom festlegen, wenn Sie 22.05 drucken möchten. Alternativ könnten Sie eine rationale Zahlenbibliothek untersuchen (z. B. Boost.Rational). Dies wäre in der Lage, den Wert 22,05 genau zu speichern, im Gegensatz zu einem Double (oder Float).