在C ++中将Double转换为String时的精度损失

时间:2016-03-03 00:41:01

标签: c++ string

所以我知道在使用精度setprecision(int n)打印double值时应该使用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

在我正在进行的项目中,我需要将double值保存为字符串,偶尔需要超过六位小数的精度。在这里,转换中明显丢失了精度。任何指针都将非常感激。

3 个答案:

答案 0 :(得分:3)

您可以使用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;
}

答案 1 :(得分:0)

试试这个:

#include <sstream>
#include <string>

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

答案 2 :(得分:0)

如果你想获得双精度的完全精度而不将其限制为一个特定的值(暗示你的“偶尔需要超过六位小数”),如果你正在使用< strong> 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更多信息以及它如何处理内部表示here

显然,如果您目前没有在项目中使用Boost,这种方法 overkill