在C++中将双精度转换为字符串时精度损失

Loss of Precision when Converting Double to String in C++

本文关键字:字符串 精度 损失 转换 C++ 双精度      更新时间:2023-10-16

所以我知道在打印具有精确n的双精度值时应该使用setprecision(int n)。但是,我在我正在处理的一个项目中遇到了一个类似于以下代码的问题:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    double var = 1.0000001;
    cout << setprecision(10)<< var << endl;
    string str = to_string(var);
    cout << str << endl;
    return 0;
}

这是输出:

1.0000001
1.000000

在我正在处理的项目中,我需要将双精度值保存为字符串,并且偶尔需要超过六位小数的精度。在这里,转换过程中显然会失去精度。任何指示将不胜感激。

您可以使用

std::stringstream .

#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main(void) {
    double var = 1.0000001;
    cout << setprecision(10)<< var << endl;
    stringstream ss;
    ss << setprecision(10) << var;
    string str;
    ss >> str;
    cout << str << endl;
    return 0;
}

如果您想获得双精度的全精度而不将其限制为特定值(由"偶尔需要超过六位小数"暗示),并且如果您正在使用 Boost 库,您还可以尝试以下替代方法:

#include <boost/lexical_cast.hpp>    
#include <iostream>
using namespace boost;
using namespace std;    
int main() {
    double var = 1.0000001;   
    cout << lexical_cast<string>(var) << endl;
    return 0;
}

这在我的一个应用程序中被证明是有用的,在这些应用程序中,精度确实很重要,并且由于使用了一些特定的日志记录函数包装器,std::stringstream方法不是很方便和优雅。您可以在此处找到有关boost::lexical_cast及其如何处理内部表示的更多信息。

显然,如果您当前没有在项目中使用 Boost,那么这种方法是矫枉过正的。

试试这个:

#include <sstream>
#include <string>
// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();