2016-04-23 10 views
1

hier:lexical_cast strtof strtold Genauigkeit verlieren?

#include <iostream> 
#include <cstdlib> 
#include <boost/lexical_cast.hpp> 

int main(void) { 
    const char * str = "277499.84"; 

    std::cout << boost::lexical_cast<double>(str) << std::endl; 
    std::cout << strtof(str, NULL) << std::endl; 
    std::cout << strtold(str, NULL) << std::endl; 
    std::cout << atof(str) << std::endl; 

    return 0; 
} 

Ausgang:

277500 
277500 
277500 
277500 

Warum die Ausgabe nicht 277.499,84?

+3

Die Standardpräzision ist 6 Ich nehme an, genau wie für 'printf''% f'. Ändern Sie es, wenn Sie es nicht mögen. –

Antwort

3

Es ist nicht die Operationen selbst verlieren Genauigkeit, aber die Ausgabe.

Mit dem E/A-Manipulator std::setprecision können Sie die numerische Genauigkeit steuern. Im Folgenden wird die volle Genauigkeit eines Double verwendet (unter der Annahme, dass der Stream für die Dezimalausgabe eingestellt ist).

double value = boost::lexical_cast<double>(str); 
std::cout << std::setprecision(std::numeric_limits<double>::digits10 + 1) << value; 

Oder Sie können std::ios_base::precision verwenden. Dies ist nützlich, wenn Sie die Genauigkeit später auf den ursprünglichen Wert zurücksetzen möchten.

auto old_precision = cout.precision(std::numeric_limits<double>::digits10 + 1); 
cout << value; 
cout.precision(old_precision); 
Verwandte Themen