2013-08-06 13 views
5

Sono di fronte a un problema di conversione per il quale mi piacerebbe il tuo aiuto. Sto usando il compilatore gcc4 e sono abbastanza limitato ad usare gcc4.incrementa la stringa di cast lessicale per raddoppiare

Voglio convertire std :: string in 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 

A proposito, ho anche provato atof e ho ancora lo stesso problema. C'è un modo per utilizzare istringstream con setprecission(2) per ottenere il valore corretto mostrato da aAmount?

+2

Devi solo stamparlo con meno precisione. Ha sempre la stessa precisione memorizzata. – chris

+1

La funzione 'boost :: lexical_cast' utilizza effettivamente' std :: istringstream' internamente per eseguire l'analisi/estrazione del valore. –

+0

Se faccio quanto segue, sto ottenendo 22 invece ... 'std :: stringstream precisionValue; precisionValue.precision (2); precisionValue << boost :: lexical_cast (aImporto) << std :: endl; double dAmount; precisionValue >> dAmount; // Ora ottengo 22' – Nostradamus

risposta

3

A causa della natura dei valori in virgola mobile, 22.050000000000001 è il valore più vicino a 22.05 che può essere memorizzato. Lo stesso potrebbe accadere se si provasse semplicemente a memorizzare 22.05 in un doppio e poi a stamparlo.

Se si desidera stampare 22.05, è necessario impostare la precisione sul flusso di uscita. In alternativa, è possibile esaminare una libreria di numeri razionali (ad esempio, Boost.Rational). Questo sarebbe in grado di memorizzare il valore 22.05 con precisione, a differenza del doppio (o del float).