青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

5D空間

學習總結與經驗交流

   :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
以下是轉帖內容:
-------------------------------------------------------------------------------------------------------------------------------------------------------------- 
 第二電腦網導讀:框、關系數據庫、金融程序、SMS程序及一切處理數據文件的程序,需要控制小數點后的小數位的情況非常普遍,本文中將要講解如何用簡單的方法來控制小數位,另外,還要揭開字符串及數據精度的一點點小秘密?! 栴}的引出  如有一個函數,其可接受一個long double參數,并將參數轉換為字符串,結果字符串應保留兩位小數,例如,浮點值123.45678應該生成"123.45"這樣的...
  正文:在許多應用程序領域中,都需要控制小數點后的小數位,但是浮點數對此不能提供直接的支持。怎樣對程序中的浮點數據進行"整齊"地格式化呢?在此我們有一個迂回的方法,先把它們轉換為字符串,格式化后以文本形式顯示出來。

  在日常編程中--包括對話框、關系數據庫、金融程序、SMS程序及一切處理數據文件的程序,需要控制小數點后的小數位的情況非常普遍,本文中將要講解如何用簡單的方法來控制小數位,另外,還要揭開字符串及數據精度的一點點小秘密。

  問題的引出

  如有一個函數,其可接受一個long double參數,并將參數轉換為字符串,結果字符串應保留兩位小數,例如,浮點值123.45678應該生成"123.45"這樣的字符串。表面上看來這是一個意義不大的編程問題,然而,如果真要在實際中派上用場,函數應設計為具有一定彈性,以允許調用者指定小數位數。另外,函數也應該能夠處理各種異常情況,如像123.0或123這樣的整數。
在開始之前,先看一下編寫"優雅"C++代碼時的兩句"真言":

  "真言"1:無論何時需要格式化一個數值,都應先轉換為一個字符串。這樣可保證每位數剛好占據一個字符。

  "真言"2:在需要轉換為字符串時,請使用<sstream>庫。

  轉換函數的接口非常簡潔:第一個參數是需被格式化的數值;第二個參數代表小數點后顯示的小數位,且應該具有一個默認值;返回值為一個string類型:

string do_fraction(long double value, int decplaces=3);

  注意,第二個參數代表的小數位數中包括了小數點,因此,兩位小數需要默認值為3。

  精度問題

  當然,第一步是把long double值轉換為一個string,使用標準C++庫<sstream>簡直是手到擒來。然而,有一件事情必須引起注意,因為某些原因,stringstream對象默認精度為6,而許多程序員錯誤地把"精度"理解為小數的位數,這是不正確的,精度應指代全部位數。因而,數字1234.56可安全地通過默認精度6來表示,但12345.67會被截斷為12345.6。這樣的話,如果你有一個非常大的數,如1234567.8,它的結果會靜悄悄地轉換為科學記數法:1.23457e+06,這顯然不是我們想要的。為避免這樣的麻煩,在開始轉換之前,應把默認精度設為最大。
為得到long double能表示的最大位數,可使用<limits>庫:

string do_fraction(long double value, int decplaces=3)
{
int prec=numeric_limits<long double>::digits10; // 18
ostringstream out;
out.precision(prec);//覆蓋默認精度
out<<value;
string str= out.str(); //從流中取出字符串 數值現在存儲在str中,等待格式化。

 

 

  小數點的位置

  要進行格式化,首先要確定小數點的位置,如果小數位多于decplaces,do_fraction()會刪除多余的。

  要定位小數位,可使用string::find(),在STL算法中使用了一個常量來代表"數值未找到",在字符串中,這個常量為string::npos:

char DECIMAL_POINT='.'; // 歐洲用法為','

size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//是否有小數點呢?
{
//檢查小數的位數
}

  如果沒有小數點,函數直接返回字符串,否則,函數將繼續檢查小數位是否多于decplaces。如果是,小數部分將會被截斷:

size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//有小數點嗎?
&&(str.size()> n+decplaces)) //后面至少還有decplaces位嗎?

//在小數decplaces位之后寫入nul
str[n+decplaces]='';

  最后一行覆蓋了多余的小數位,它使用了常量來截斷字符串,要注意,string對象的數據可以包含nul字符;而字符串的實際長度由size()的返回值決定。因此,你不能假定字符串已被正確地格式化,換句話來說,如果在str中原來為"123.4567",在插入常量之后,它變成了"123.457",為把str縮減為"123.45",一般可使用自交換的方法: str.swap(string(str.c_str()) );//刪除nul之后的多余字符

  那它的原理是什么呢?函數string::c_str()返回一個const char *代表此字符串對象,而這個值被用作一個臨時string對象的初始化值,接著,臨時對象又被用作str.swap()的參數,swap()會把值"123.45"賦給str。一些老一點的編譯器不支持默認模板參數,可能不會讓swap()通過編譯,如果是這樣的話,使用手工交換來代替:

string temp=str.c_str();
str=temp;

  代碼雖不是很"優美",但能達到目的就行。以下是do_fraction()的完整代碼:

string do_fraction(long double value, int decplaces=3)
{
 ostringstream out;
 int prec=
 numeric_limits<long double>::digits10; // 18

 out.precision(prec);//覆蓋默認精度
 out<<value;
 string str= out.str(); //從流中取出字符串
 size_t n=str.find(DECIMAL_POINT);
 if ((n!=string::npos) //有小數點嗎?
 && (str.size()> n+decplaces)) //后面至少還有decplaces位嗎?
 {
  str[n+decplaces]='';//覆蓋第一個多余的數
 }

 str.swap(string(str.c_str()));//刪除nul之后的多余字符

 return str;
}

  如果不想通過傳值返回一個string對象,還可增加一個參數,把str對象以引用傳遞:

void do_fraction(long double value, string & str, int decplaces=3);

  從個人的角度來講,還是傾向于讓編譯器做這樣的優化,另外,使用傳值返回,還可以讓你以下面這種方式使用do_fraction():

cout << funct(123456789.69999001) << 't' << funct(12.011)<<endl;

  輸出:

  123456789.69 12.01
--------------------------------------------------------------------------------------------------------------------------------------------------------------
先簡單理清一下思路:
1 將double以最大精度保存在ss里
2 通過小數點來檢測實際精度是否超過需要的精度
3 如果超過,截斷
4 返回字符串

補充一下,第3步應該加一個四舍五入功能。這個比較簡單,按相應的位數+5后再截斷就好了
posted on 2011-05-31 11:38 今晚打老虎 閱讀(424) 評論(0)  編輯 收藏 引用 所屬分類: 學習筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久亚洲精品杨幂换脸| 亚洲欧洲综合另类在线| 久久国产精品99国产精| 亚洲一区二区三区四区视频| 亚洲视频你懂的| 午夜精品av| 久久精品国产99| 欧美成人精品1314www| 女同一区二区| 欧美视频福利| 国内一区二区三区在线视频| 在线免费观看日本一区| 亚洲美女性视频| 亚洲欧美一区二区激情| 久久久水蜜桃| 亚洲美女免费精品视频在线观看| 亚洲一区二区三区欧美| 久久综合久久美利坚合众国| 欧美日韩成人| 国产字幕视频一区二区| 亚洲精一区二区三区| 欧美一区二区三区在线看| 欧美高清视频一区二区| 亚洲一二三区在线| 欧美丰满高潮xxxx喷水动漫| 欧美性猛交99久久久久99按摩| 国内外成人免费激情在线视频| 日韩亚洲在线| 久久在线免费观看| 亚洲四色影视在线观看| 牛牛影视久久网| 国内精品嫩模av私拍在线观看| 国产精品99久久久久久宅男| 免播放器亚洲一区| 性视频1819p久久| 国产精品yjizz| 亚洲黄色免费网站| 久久亚洲春色中文字幕| 亚洲视频欧美视频| 欧美日韩午夜在线| 最新亚洲一区| 免费观看30秒视频久久| 午夜一区二区三区不卡视频| 欧美日韩中文在线观看| 亚洲精品视频啊美女在线直播| 久久精品亚洲精品| 一本一本久久| 欧美日韩国产黄| 亚洲久久一区二区| 久久久最新网址| 欧美高清视频一区二区三区在线观看| 午夜精品久久久久| 国产精品视频免费观看| 宅男噜噜噜66一区二区| 亚洲国产日韩在线| 亚洲欧美日韩在线不卡| 国产精品久久亚洲7777| 亚洲特黄一级片| 一本色道久久综合亚洲精品不| 欧美激情一区| 一本色道久久综合亚洲二区三区| 欧美福利专区| 欧美国产亚洲另类动漫| 亚洲美洲欧洲综合国产一区| 亚洲第一在线| 欧美人交a欧美精品| 亚洲婷婷综合色高清在线| 一本色道久久综合亚洲精品婷婷| 欧美视频在线观看免费网址| 亚洲一区二区伦理| 亚洲永久精品国产| 国产一区999| 欧美成人免费一级人片100| 农村妇女精品| 亚洲深夜福利视频| 亚洲综合色婷婷| 一区二区在线视频| 亚洲第一在线视频| 国产精品狠色婷| 久久激情综合网| 久久综合五月| 亚洲一区二区三区在线观看视频 | 国产精品亚洲综合一区在线观看| 亚洲欧美日韩系列| 久久不射中文字幕| 亚洲精品日韩激情在线电影| 日韩网站在线看片你懂的| 国产精品久久久久av| 另类图片国产| 欧美日韩亚洲一区| 欧美在线网址| 欧美极品在线视频| 久久国产精品免费一区| 免费成人黄色片| 亚洲欧美激情诱惑| 久久综合九色欧美综合狠狠| 在线一区二区日韩| 性欧美暴力猛交69hd| 亚洲美女av网站| 欧美一区二区免费| 一本色道久久综合| 久久九九精品99国产精品| 99re热这里只有精品视频| 午夜精品一区二区三区电影天堂 | 国产精品入口麻豆原神| 女同一区二区| 国产精品亚洲成人| 亚洲精品社区| 麻豆av一区二区三区久久| 欧美片在线播放| 久久亚洲私人国产精品va媚药| 欧美另类在线播放| 另类天堂视频在线观看| 国产精品一区久久久久| 亚洲精品少妇| 亚洲国产欧美国产综合一区| 欧美一级理论性理论a| 亚洲午夜一区| 欧美欧美午夜aⅴ在线观看| 免费观看在线综合| 国产欧美日韩亚洲| 一区二区三区四区蜜桃| 一区二区三区视频在线| 欧美激情一区二区三区不卡| 欧美大片91| 永久免费精品影视网站| 欧美中日韩免费视频| 欧美在线三级| 国产精品久久久久av| 一区二区日韩| 亚洲一区二区三区777| 欧美日韩免费看| 一本色道久久综合精品竹菊| aa成人免费视频| 欧美日韩国产在线播放| 亚洲精品色图| 亚洲一区二区三区在线视频| 欧美特黄一级大片| 亚洲永久免费av| 久久精品伊人| 黄色成人在线网站| 久久免费偷拍视频| 欧美激情偷拍| 99国产精品自拍| 欧美三区在线| 亚洲欧美日韩国产精品| 久久久一二三| 亚洲激情在线激情| 欧美视频精品在线| 亚洲女性裸体视频| 美国成人毛片| 亚洲精品专区| 国产精品麻豆成人av电影艾秋| 亚洲女性喷水在线观看一区| 久久久久久久成人| 亚洲欧洲精品成人久久奇米网 | 麻豆成人在线| 亚洲精品久久久久| 亚洲欧美成人网| 国产综合精品| 欧美成人中文字幕| 亚洲一区二区三区精品在线观看 | 亚洲成色999久久网站| 欧美aa在线视频| 在线亚洲高清视频| 久久久久综合网| 亚洲毛片av| 国产日韩欧美亚洲| 欧美大片91| 亚洲女人天堂成人av在线| 欧美成人激情在线| 亚洲欧美激情视频在线观看一区二区三区 | 欧美aⅴ99久久黑人专区| 亚洲国产日韩综合一区| 欧美视频免费| 久久精品在线播放| 夜夜嗨av一区二区三区四季av| 久久九九精品| 亚洲图片欧美一区| 亚洲国产精品悠悠久久琪琪| 国产精品久久精品日日| 免费在线观看日韩欧美| 欧美一区二区三区在线观看 | 亚洲美女淫视频| 嫩草影视亚洲| 欧美在线观看日本一区| 一区二区三区欧美在线| 精品动漫3d一区二区三区| 国产精品久久久久aaaa| 欧美va天堂| 久久久久国产精品www| 亚洲视频中文| 日韩网站在线看片你懂的| 欧美激情第3页| 久久福利精品| 性欧美videos另类喷潮| 亚洲视频在线观看免费| 亚洲精品小视频在线观看| 在线看片一区| 狠狠做深爱婷婷久久综合一区|