2013-08-06 17 views
5

Yardımla ilgili bir sorunla karşı karşıya getiriyorum. Ben gcc4 derleyici kullanıyorum ve gcc4 kullanmak için oldukça kısıtlıyım.Sözdizimli döküm dizesini çifte

Std :: string'i double'a dönüştürmek istiyorum.

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 

arada, ben de atof çalıştı ve hala aynı sorunu var. aAmount tarafından gösterilen doğru değeri almak için setprecission(2) ile istringstream kullanmak için herhangi bir yolu var mı?

+2

Sadece daha az hassasiyetle yazdırmanız gerekiyor. Her zaman aynı hassasiyet saklanır. – chris

+1

'boost :: lexical_cast' işlevi aslında değerin ayrıştırılması/çıkarılması için dahili olarak std :: istringstream' işlevini kullanır. –

+0

Aşağıdakileri yaparsam, 22 tane alıyorum ... 'std :: stringstream precisionValue; precisionValue.precision (2); precisionValue << boost :: lexical_cast (aAmount) << std :: endl; çift dAmount; precisionValue >> dAmount; // Şimdi 22 ' – Nostradamus

cevap

3

Kayan nokta değerlerinin doğası nedeniyle 22.050000000000001 en fazla 22.05 değerine kadar saklanabilir. Aynı şey, 22.05 değerini çift olarak kaydetmeye ve yazdırmaya çalışsanız ortaya çıkar.

22.05 yazdırmak istiyorsanız, çıktı akışında kesinliği ayarlamanız gerekir. Alternatif olarak, bir rasyonel sayı kütüphanesini araştırabilirsiniz (örneğin, Boost.Rational). Bu, bir çift (veya şamandıranın) aksine, 22.05 değerini tam olarak kaydedebilecektir.