您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C++ float轉std::string小數位數控制問題怎么解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++ float轉std::string小數位數控制問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
float a = 1122.334455; std::stringstream buf; buf.precision(2);//覆蓋默認精度 buf.setf(std::ios::fixed);//保留小數位 buf << a << "文字"; std::string str; str = buf.str();
float a = 1122.334455; char* chCode; chCode = new(std::nothrow)char[20]; sprintf(chCode, "%.2lf", a);// .2 是控制輸出精度bai的,兩位小數 std::string strCode(chCode); delete []chCode;
在進行string轉float過程中,發現有些數顯示位數不同(存在數精度少了一位的情況,例如:0.1285354 轉換后,顯示 0.128535)
數據如下:
0.0281864
-0.0635702
0.0457153
0.1285354
-0.0254498
...
后了解到 float 只顯示有效位數 6 位, 而 double 顯示有效位數 15 位
float
有效數字位為6 – 7位,字節數為4,指數長度為8位,小數長度為23位。取值范圍為 3.4E-38~3.4E+38。
double
有效數字位為15 – 16位,字節數為8,指數長度為11位,小數長度為52位。取值范圍為1.7E-308~1.7E+308。
隨即思考,是不是轉換后賦值到了float上,導致精度降低呢?
馬上修改賦值到double類型上,然而任然顯示有誤。
這才想到會不會使 cout 輸出精度的問題,搜索后發現 cout 需要調用 precision() 成員函數來設置顯示精度,而 cout 默認精度為6位有效數字,哈哈真是湊巧,跟 float 精度一樣。
修改后代碼如下:
#include <iostream> #include <string> #include <string.h> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { const string tmp_str = "0.1285354"; float tmp_f = 0; double tmp = 0; cout.precision(16); cout << sizeof(tmp_f) << "--" << sizeof(tmp) << endl; cout << stof(tmp_str) << endl; cout << stod(tmp_str) << endl; cout << stold(tmp_str) << endl; cout << strtod(tmp_str.c_str(), NULL) << endl; cout << atof(tmp_str.c_str()) << endl; tmp = 0.1234567890123456; cout << tmp << endl; return 0; }
程序輸出
nvidia@nx:~/pengjing/cuda$ ./location
4--8
0.1285354048013687
0.1285354
0.1285354
0.1285354
0.1285354
0.1234567890123456
cout 設置浮點數輸出精度方法
方法一(全局設置 cout 輸出精度)
#include <iostream> double tmp = 0.1234567890123456; cout.precision(16); //此處設置后,全局有效;cout浮點數輸出精度均為16 cout << tmp << endl;
方法二(全局設置 cout 輸出精度)
#include <iostream> #include <iomanip> double tmp = 0.1234567890123456; cout << setprecision(16) << tmp << endl; //此處設置后,全局有效;后面cout浮點數輸出精度均為16 cout << 0.1234567890123456 << endl; // 0.1234567890123456
讀到這里,這篇“C++ float轉std::string小數位數控制問題怎么解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。