2016-04-23 5 views
1

lexical_cast strtof strtoldは正確さを失うのですか?ここで

#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; 
} 

が出力:

277500 
277500 
277500 
277500 

出力は277499.84されないのはなぜ?

+3

デフォルト精度は 'printf'の'%f'と同じです。それが気に入らなければ変更してください。 –

答えて

3

精度自体が低下する操作ではなく、出力です。

I/Oマニピュレータstd::setprecisionを使用して、数値精度を制御できます。以下は、doubleの完全精度を使用します(ストリームが小数出力に設定されていると仮定します)。

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

またはstd::ios_base::precisionを使用できます。これは、精度を元の値に戻す場合に便利です。

auto old_precision = cout.precision(std::numeric_limits<double>::digits10 + 1); 
cout << value; 
cout.precision(old_precision); 
関連する問題