1

ここ:

#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 でないのはなぜですか?

4

1 に答える 1

3

精度を失うのは操作自体ではなく、出力です。

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

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 );
于 2016-04-23T11:30:11.010 に答える