2013-08-06 6 views
5

У меня возникла проблема с конверсией, для которой я хотел бы получить вашу помощь. Я использую компилятор gcc4, и я довольно ограничен, чтобы использовать gcc4.увеличить лексическую строку литья, чтобы удвоить

Я хочу преобразовать std :: string в double.

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 

Кстати, я также попытался atof и я до сих пор один и тот же вопрос. Есть ли способ использовать istringstream с setprecission(2), чтобы получить правильное значение, указанное aAmount?

+2

Вам просто нужно напечатать его с меньшей точностью. Он всегда имеет ту же точность. – chris

+1

Функция 'boost :: lexical_cast' фактически использует' std :: istringstream' внутри, чтобы выполнить синтаксический анализ/извлечение значения. –

+0

Если я сделаю следующее, я получаю 22 вместо этого ... 'std :: stringstream precisionValue; precisionValue.precision (2); precisionValue << boost :: lexical_cast (aAmount) << std :: endl; double dAmount; precisionValue >> dAmount; // Теперь я получаю 22' – Nostradamus

ответ

3

Из-за природы значений с плавающей запятой 22.050000000000001 является самым близким значением до 22.05, которое может быть сохранено. То же самое произошло бы, если бы вы просто попытались сохранить 22.05 в двойном и затем распечатать его.

Вы должны установить точность выходного потока, если хотите напечатать 22.05. В качестве альтернативы вы можете исследовать библиотеку рациональных номеров (например, Boost.Rational). Это могло бы точно сохранить значение 22.05, в отличие от двойного (или плавающего).