2013-08-06 14 views
5

私はあなたの助けが必要な変換問題に直面しています。私はgcc4コンパイラを使用していますが、gcc4の使用はかなり制限されています。語彙キャスト文字列を2倍にする

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を試してみましたが、私はまだ同じ問題を持っています。 istringstreamsetprecission(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; //今すぐ取得します。 ' – Nostradamus

答えて

3

浮動小数点値の性質のため、22.050000000000001は格納可能な22.05に最も近い値です。もしあなたが単に22.05を二重に保存しようとしてからそれを印刷しようとするなら、同じことが起こります。

22.05を出力する場合は、出力ストリームの精度を設定する必要があります。あるいは、有理数ライブラリを調べることもできます(たとえば、Boost.Rational)。これは、double(またはfloat)とは異なり、正確に22.05の値を格納することができます。

関連する問題