string轉double后,因為精度問題的解決方法


常見問題:string轉double后,因為精度問題,導致對double進行四舍五入的時候不精確的問題,找到一個比較好的方法。方法見FormatDecimal。調用示例見最底部。

錯誤方法:string (“442477.876106195”)=> double(442477.87610619498)=> 保留8位小數結果為 (442477.87610619),實際結果應該為(442477.87610620)
正確方法:string (“442477.876106195”)=> double(442477.87610619498)=> FormatDecimal方法處理后結果為(442477.87610619998)=> 保留8位小數結果為(442477.87610620
 
 
 
/*
* 函數名稱: FormatDecimal
* 函數功能: 提高double四舍五入前數據的精度
* 參    數:
* dblValue    原始double數據
* nDecimal  四舍五入的位數
* 返 回 值: 四舍五入前的double數據
* 示    例: FormatDecimal (442477.87610619498 , 8)=442477.87610619998
*/
double FormatDecimal(double dblValue, int nDecimal)
{
double dRetval;
double dMod = 0.0000001;
if (dblValue < 0.0) dMod = -0.0000001;
dRetval = dblValue;
dRetval += (5.0 / pow(10.0, nDecimal + 1.0));
dRetval *= pow(10.0, nDecimal);
dRetval = floor(dRetval + dMod);
dRetval /= pow(10.0, nDecimal);
return(dRetval);
}

 
 
調用示例:
fReturn = _tstof(strReturn.c_str());
fReturn = FormatDecimal(fReturn, iDotnum);
std::stringstream buffer;
buffer << std::fixed << std::setprecision(iDotnum) << fReturn;
strReturn.assign(buffer.str());


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM