簡體   English   中英

在C ++中將Double轉換為String時的精度損失

[英]Loss of Precision when Converting Double to String in C++

所以我知道在打印精度為n的double值時應該使用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

在我正在進行的項目中,我需要將double值保存為字符串,並且偶爾需要超過六位小數的精度。 在這里,轉換中明顯丟失了精度。 任何指針都將非常感激。

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

嘗試這個:

#include <sstream>
#include <string>

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

如果你想獲得雙精度完整精度而不將其限制為一個特定的值(暗示你的“偶爾需要超過六位小數”),如果你使用的是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,這種方法就太過分了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM