2013-08-06 25 views
5

Mam do czynienia z problemem konwersji, dla którego chciałbym twojej pomocy. Używam kompilatora gcc4 i jestem całkowicie ograniczony do korzystania z gcc4.Podnieś ciąg tekstowy do podwożenia

Chcę przekonwertować std :: string na podwójne.

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 

Nawiasem mówiąc, ja też próbowałem atof i nadal mam ten sam problem. Czy istnieje sposób użycia istringstream z setprecission(2), aby uzyskać poprawną wartość pokazywaną przez aAmount?

+2

Trzeba tylko wydrukować go z mniejszą precyzją. Zawsze ma dokładnie taką samą dokładność. – chris

+1

Funkcja 'boost :: lexical_cast' używa wewnętrznie' std :: istringstream' do parsowania/wyodrębniania wartości. –

+0

Jeśli wykonać następujące czynności, otrzymuję 22 zamiast ... 'std :: stringstream precisionValue; precisionValue.precision (2); precisionValue << boost :: lexical_cast (aAmount) << std :: endl; double dAmount; precisionValue >> dAmount; // Teraz mam 22'' – Nostradamus

Odpowiedz

3

Ze względu na charakter wartości zmiennoprzecinkowych, 22.050000000000001 jest najbliższą wartości do 22,05, którą można zapisać. To samo by się zdarzyło, gdybyś po prostu próbował zapisać 22,05 w podwójnym, a następnie wydrukować.

Powinieneś ustawić precyzję strumienia wyjściowego, jeśli chcesz wydrukować 22.05. Ewentualnie możesz zbadać racjonalną bibliotekę numerów (na przykład Boost.Rational). Byłoby to w stanie dokładnie zapisać wartość 22.05, w przeciwieństwie do podwójnego (lub zmiennoprzecinkowego).