欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題

 更新時間:2022年11月08日 10:12:03   作者:Atticus_DY  
這篇文章主要介紹了C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

float轉(zhuǎn)std::string 小數(shù)位數(shù)控制

std::stringstream 方式

?? ?float a = 1122.334455;
?? ?std::stringstream buf;
?? ?buf.precision(2);//覆蓋默認(rèn)精度
?? ?buf.setf(std::ios::fixed);//保留小數(shù)位
?? ?buf << a << "文字";
?? ?std::string str;
?? ?str = buf.str();

sprintf 方式

? ? float a = 1122.334455;
?? ?char* chCode;
?? ?chCode = new(std::nothrow)char[20];
?? ?sprintf(chCode, "%.2lf", a);// .2 是控制輸出精度bai的,兩位小數(shù)
?? ?std::string strCode(chCode);
?? ?delete []chCode;

string轉(zhuǎn)float顯示位數(shù)有誤;cout 的 precision 成員函數(shù)

問題描述

在進(jìn)行string轉(zhuǎn)float過程中,發(fā)現(xiàn)有些數(shù)顯示位數(shù)不同(存在數(shù)精度少了一位的情況,例如:0.1285354 轉(zhuǎn)換后,顯示 0.128535)

數(shù)據(jù)如下:

0.0281864
-0.0635702
0.0457153
0.1285354
-0.0254498
...

問題分析

后了解到 float 只顯示有效位數(shù) 6 位, 而 double 顯示有效位數(shù) 15 位

  • float有效數(shù)字位為6 – 7位,字節(jié)數(shù)為4,指數(shù)長度為8位,小數(shù)長度為23位。取值范圍為 3.4E-38~3.4E+38。
  • double有效數(shù)字位為15 – 16位,字節(jié)數(shù)為8,指數(shù)長度為11位,小數(shù)長度為52位。取值范圍為1.7E-308~1.7E+308。

隨即思考,是不是轉(zhuǎn)換后賦值到了float上,導(dǎo)致精度降低呢?

馬上修改賦值到double類型上,然而任然顯示有誤。

這才想到會不會使 cout 輸出精度的問題,搜索后發(fā)現(xiàn) cout 需要調(diào)用 precision() 成員函數(shù)來設(shè)置顯示精度,而 cout 默認(rèn)精度為6位有效數(shù)字,哈哈真是湊巧,跟 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 設(shè)置浮點(diǎn)數(shù)輸出精度方法

方法一(全局設(shè)置 cout 輸出精度)

#include <iostream>
double tmp = 0.1234567890123456;
cout.precision(16);?? ?//此處設(shè)置后,全局有效;cout浮點(diǎn)數(shù)輸出精度均為16
cout << tmp << endl;

方法二(全局設(shè)置 cout 輸出精度)

#include <iostream>
#include <iomanip>
double tmp = 0.1234567890123456;
cout << setprecision(16) << tmp << endl; //此處設(shè)置后,全局有效;后面cout浮點(diǎn)數(shù)輸出精度均為16
cout << 0.1234567890123456 << endl;?? ?// 0.1234567890123456

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言數(shù)據(jù)的存儲超詳細(xì)講解上篇

    C語言數(shù)據(jù)的存儲超詳細(xì)講解上篇

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-04-04
  • C++設(shè)置超時時間的簡單實(shí)現(xiàn)方法

    C++設(shè)置超時時間的簡單實(shí)現(xiàn)方法

    這篇文章主要介紹了C++設(shè)置超時時間的簡單實(shí)現(xiàn)方法,涉及系統(tǒng)函數(shù)setsockopt對套接口的操作,具有一定的實(shí)用價值,需要的朋友可以參考下
    2014-10-10
  • C++字符串的截取問題

    C++字符串的截取問題

    這篇文章主要介紹了C++字符串的截取問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng)

    C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 常用的STL查找算法

    常用的STL查找算法

    這篇文章主要介紹了常用的STL查找算法的相關(guān)資料,十分的詳細(xì),需要的朋友可以參考下
    2015-07-07
  • C語言哈希表概念超詳細(xì)講解

    C語言哈希表概念超詳細(xì)講解

    哈希是一種很高效的存儲數(shù)據(jù)的結(jié)構(gòu),它是利用的一種映射關(guān)系,它也是STL中unordered_map和unordered_set?的底層結(jié)構(gòu)。本文,主要講解哈希的原理,哈希的實(shí)現(xiàn),里面關(guān)鍵點(diǎn)在于如何解決哈希沖突
    2023-02-02
  • C/C++中多重繼承詳解及其作用介紹

    C/C++中多重繼承詳解及其作用介紹

    這篇文章主要介紹了C/C++中多重繼承詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等

    C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等

    這篇文章主要為大家介紹了C++ LeetCode1775通過最少操作次數(shù)使數(shù)組和相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • c語言socket多線程編程限制客戶端連接數(shù)

    c語言socket多線程編程限制客戶端連接數(shù)

    這篇文章主要介紹了c語言socket多線程編程,可以限制客戶端連接數(shù),大家參考使用吧
    2013-12-12
  • 詳解C++11中的類型推斷

    詳解C++11中的類型推斷

    C++11中為了更好的支持泛型編程,提供了?auto和decltype兩個關(guān)鍵詞,目的就是提供編譯階段的自動類型推導(dǎo),這篇文章主要介紹了C++11中的類型推斷,需要的朋友可以參考下
    2023-01-01

最新評論