C++ 实现科学计数法string转double

用于将形如"+2.449E+2"的科学计数法字符串转为244.9的浮点型数值

代码如下, 如有疏漏, 欢迎指正

 1 double sci2db(const std::string &strSci)
 2 {
 3   int    iPower       = 0;  //
 4   double dMntsa       = 0;  //尾数
 5   double dCoefficient = 1;  //系数
 6 
 7   std::string strPower, strMntsa;
 8 
 9   if (std::string::npos == strSci.find("E"))
10   {
11     return atof(strSci.c_str());
12   }
13 
14   strMntsa = strSci.substr(0, strSci.find("E"));
15   strPower = strSci.substr(strSci.find("E") + 1);
16 
17   dMntsa = atof(strMntsa.c_str());
18   iPower = atoi(strPower.c_str());
19 
20   while (iPower != 0)
21   {
22     if (iPower > 0)
23     {
24       dCoefficient *= 10;
25       iPower--;
26     }
27     else
28     {
29       dCoefficient *= 0.1;
30       iPower++;
31     }
32   }
33 
34   return dMntsa * dCoefficient;
35 }

使用intel i5-8265U @ 1.60GHz 1.80GHz, 对字符串"+2.449E+2"转换1000次用时1200ms左右

如果通过一个'0'~'9'的数表自行实现for循环替换atof, atoi的话, 同样条件转换1000次用时1000ms左右, 但是对入参的容错率很低, atof和atoi函数对入参的容错率很高

大家如果有兴趣可以自己尝试一下

posted @ 2020-04-23 10:04  public_tsing  阅读(3464)  评论(0编辑  收藏  举报