標籤:style color 使用 os io strong 檔案 ar
double型轉換成string型
題目描述:
如有一個函數,其可接受一個long double參數,並將參數轉換為字串,結果字串應保留兩位小數,例如,浮點值123.45678應該產生“123.45”這樣的字串。表面上看來 這是一個意義不大的編程問題,然而,如果真要在實際中派上用場,函數應設計為具有一定彈性,以允許調用者指定小數位元。另外,函數也應該能夠處理各種異常 情況,如像123.0或123這樣的整數。
轉換函式介面:string do_fraction(long double value, int decplaces = 3)
題目分析:
經驗之談:①無論何時需要格式化一個數值,都應該先轉換為一個字串,這樣可保證每位元剛好佔據一個字元。②需要轉化為字串時候,可以考慮使用庫函數
使用庫函數將long double值轉化為一個string應該很簡單,但是需要注意下面幾個問題:
1)精度問題
因為stringstream對象預設精度為6,(這裡需要強調一個精度,老式指的是小數位元,新式應該指的是全部位元),這就會有出現一個問題:如果非常大的數,例如123456789.9,它就會轉化為科學計數法,這顯然不是我們需要的,所以我們使用庫函數和轉換之前,必須先把預設的精度設為最大
2)小數點位置問題
定位小數位使用string::find
在STL演算法中使用一個常量來代表“數值未找到”,字串中是string::npos
因為我們設定了小數點最大位元decplacea,所以我們要檢查小數點位元,如果小於它,那麼直接返回字串,否則小數部分多餘的要被截去。截斷字串的方法:通常使用\0
插入變數\0之後,如何截去後面的字元,一般採用自交換
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
參考代碼:
string do_fraction(long double value, int decplaces = 3){ ostringstream out; int prec = numeric_limits::digits10; //18 注意需要加上標頭檔#include<limits> out.precision(prec); //覆蓋預設精度 //從流中取出字串 string str = out.str(); //判斷是否有小數點,且還有decpalces位 size_t n = str.find(DECIMAL_POINT); if((n != string::npos) && (str.size() > n + decplaces)) { str[n + decplaces] = ‘\0‘; //覆蓋第一個多餘的數字 } str.swap(string(str.c_str())); //刪除NULL之後多餘的字元 return str;}