截取浮点数小数点后指定位数的一种做法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

作者:朱金灿
来源:http://blog.csdn.net/clever101/


      对浮点数进行小数点后指定位数输出经常是日常编程中遇到的一个问题。令我稍感奇怪的是网上这方面的资料不多。实际上这种指定有效位数输出有时要经历四舍五入的变换。晚上参考了网上一篇文章的做法,实现了一个函数:


  

  1. /*! 
  2. *  @brief 对浮点数四舍五入后指定位数输出 
  3. * 
  4. *  @param dbNum  [in]待处理的浮点数 
  5. *  @param decplaces [in]小数点后的位数 
  6. *  @return 输出字符串 
  7. */   
  8. std::string NumRounding(double dbNum,int decplaces)  
  9. {  
  10.     // stringstream对象默认精度为,这里利用numeric_limits将精度设置为long double覆盖默认精度  
  11.     int prec=std::numeric_limits<long double>::digits10;   
  12.     std::ostringstream oss;  
  13.     oss.precision(prec);  
  14.     oss<<dbNum;  
  15.     std::string strNum = oss.str();  
  16.     // 求取小数点位置  
  17.     size_t DecPos = strNum.find('.');  
  18.     // 若找不到小数点,就直接返回  
  19.     if(DecPos==std::string::npos)  
  20.         return strNum;  
  21.     //假如原有的小数点位数小于等于有效位数  
  22.     size_t len = strNum.size();  
  23.     if((len-DecPos-1)<=decplaces)  
  24.         return strNum;  
  25.     // 先进行四舍五入,比如输出四舍五入一位,就加.05  
  26.     int nTmp = decplaces+1;  
  27.     double exa = 1.0;  
  28.     while(nTmp--)  
  29.     {  
  30.         exa = exa/10.0;  
  31.     }  
  32.     double dbAppen = 5*exa;  
  33.     double tmp = dbNum + dbAppen;  
  34.       
  35.     // 清空缓存,重新进行格式化  
  36.     oss.str("");   
  37.     oss<<tmp;  
  38.     std::string strResult = oss.str();  
  39.     // 截取字符串  
  40.     strResult = strResult.substr(0,strResult.find('.')+decplaces+1);  
  41.     return strResult;  
  42. }   
/*!*  @brief 对浮点数四舍五入后指定位数输出**  @param dbNum  [in]待处理的浮点数*  @param decplaces [in]小数点后的位数*  @return 输出字符串*/ std::string NumRounding(double dbNum,int decplaces){ // stringstream对象默认精度为,这里利用numeric_limits将精度设置为long double覆盖默认精度 int prec=std::numeric_limits<long double>::digits10;  std::ostringstream oss; oss.precision(prec); oss<<dbNum; std::string strNum = oss.str(); // 求取小数点位置 size_t DecPos = strNum.find('.'); // 若找不到小数点,就直接返回 if(DecPos==std::string::npos)  return strNum; //假如原有的小数点位数小于等于有效位数 size_t len = strNum.size(); if((len-DecPos-1)<=decplaces)  return strNum; // 先进行四舍五入,比如输出四舍五入一位,就加.05 int nTmp = decplaces+1; double exa = 1.0; while(nTmp--) {  exa = exa/10.0; } double dbAppen = 5*exa; double tmp = dbNum + dbAppen;        // 清空缓存,重新进行格式化 oss.str("");  oss<<tmp; std::string strResult = oss.str(); // 截取字符串    strResult = strResult.substr(0,strResult.find('.')+decplaces+1); return strResult;} 


   测试代码:


  

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     double dbNum = 10.1234;  
  4.     int decplaces=2;  
  5.     std::string str = NumRounding(dbNum,decplaces);  
  6.     float dbResult = atof(str.c_str());  
  7.     double dbResult2 = atof(str.c_str());  
  8.     return 0;  
  9. }   
int _tmain(int argc, _TCHAR* argv[]){ double dbNum = 10.1234; int decplaces=2; std::string str = NumRounding(dbNum,decplaces); float dbResult = atof(str.c_str()); double dbResult2 = atof(str.c_str()); return 0;} 


思考题:


1.测试代码中dbResult和dbResult2有什么区别吗?为什么有这种区别呢?(提示:float和double的精度不同)。



参考文献:


1. 小数点后截位问题,作者:牛司朋。








           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值