lexical_cast strtof strtold 失去准确性?
lexical_cast strtof strtold lose accuracy?
这里:
#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?
不是操作本身失去准确性,而是输出。
您可以使用 I/O 操纵器 std::setprecision
来控制数值精度。下面将使用双精度的全精度(假设流设置为十进制输出)。
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 );
这里:
#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?
不是操作本身失去准确性,而是输出。
您可以使用 I/O 操纵器 std::setprecision
来控制数值精度。下面将使用双精度的全精度(假设流设置为十进制输出)。
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 );