double型轉換成string型
題目描寫敘述:
如有一個函數。其可接受一個long double參數,並將參數轉換為字符串。結果字符串應保留兩位小數,比如,浮點值123.45678應該生成“123.45”這種字符串。表面上看來 這是一個意義不大的編程問題,然而。假設真要在實際中派上用場。函數應設計為具有一定彈性,以同意調用者指定小數位數。另外,函數也應該可以處理各種異常 情況,如像123.0或123這種整數。
轉換函數接口:string do_fraction(long double value, int decplaces = 3)
題目分析:
經驗之談:①不管何時須要格式化一個數值。都應該先轉換為一個字符串,這樣可保證每位數剛好占領一個字符。②須要轉化為字符串時候,能夠考慮使用庫函數
使用庫函數將long double
值轉化為一個string
應該非常easy,可是須要注意以下幾個問題:
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;
}