C++ 从字符串到数字
我曾尝试制作一个小函数,将整数和浮点数转换为字符串,保存为双精度类型,一切正常,但当我在逗号后面输入许多数字时,出现了一些问题C++ 从字符串到数字,c++,string,double,C++,String,Double,我曾尝试制作一个小函数,将整数和浮点数转换为字符串,保存为双精度类型,一切正常,但当我在逗号后面输入许多数字时,出现了一些问题 #include <iostream> #include <cmath> using namespace std; /////////////////////////////////////CONVERTer FUNCTION///////// double StrToNum(string InStr) { int a=0; double b,O
#include <iostream>
#include <cmath>
using namespace std;
/////////////////////////////////////CONVERTer FUNCTION/////////
double StrToNum(string InStr)
{
int a=0;
double b,OutInt=0,DecVal=0,DoubleOut;
for(a;a<=InStr.length();a++)
{
if(InStr[a]=='.' || InStr[a]==','){break;}
if(InStr[a]=='0'){OutInt=OutInt*10+0;}
if(InStr[a]=='1'){OutInt=OutInt*10+1;}
if(InStr[a]=='2'){OutInt=OutInt*10+2;}
if(InStr[a]=='3'){OutInt=OutInt*10+3;}
if(InStr[a]=='4'){OutInt=OutInt*10+4;}
if(InStr[a]=='5'){OutInt=OutInt*10+5;}
if(InStr[a]=='6'){OutInt=OutInt*10+6;}
if(InStr[a]=='7'){OutInt=OutInt*10+7;}
if(InStr[a]=='8'){OutInt=OutInt*10+8;}
if(InStr[a]=='9'){OutInt=OutInt*10+9;}
}
for(a=0;a<=InStr.length();a++)
{
if(InStr[a]=='.' || InStr[a]==','){a+=1; b=1; break;}
}
for(a;a<=InStr.length();a++)
{
if(InStr[a]=='0'){ b+=1;}
if(InStr[a]=='1'){DecVal=DecVal+1/pow(10,b); b+=1;}
if(InStr[a]=='2'){DecVal=DecVal+2/pow(10,b); b+=1;}
if(InStr[a]=='3'){DecVal=DecVal+3/pow(10,b); b+=1;}
if(InStr[a]=='4'){DecVal=DecVal+4/pow(10,b); b+=1;}
if(InStr[a]=='5'){DecVal=DecVal+5/pow(10,b); b+=1;}
if(InStr[a]=='6'){DecVal=DecVal+6/pow(10,b); b+=1;}
if(InStr[a]=='7'){DecVal=DecVal+7/pow(10,b); b+=1;}
if(InStr[a]=='8'){DecVal=DecVal+8/pow(10,b); b+=1;}
if(InStr[a]=='9'){DecVal=DecVal+9/pow(10,b); b+=1;}
}
DoubleOut=OutInt+DecVal;
return DoubleOut;
}
/////////////////////////////////////CONVERTer FUNCTION/////////
int main ()
{
string InStr;
double DoubleOut;
cout<<"Please input number(will be saved as string)"<<endl;
cin>>InStr;
DoubleOut=StrToNum(InStr);
cout<<"Integer converted from string= "<<DoubleOut<<endl;
system("PAUSE");
return 0;
}
#包括
#包括
使用名称空间std;
/////////////////////////////////////转换器功能/////////
双StrToNum(字符串指令)
{
int a=0;
双b,OUTIT=0,DecVal=0,双输出;
对于(a;a)p>将字符串转换成浮点数是不平凡的。显而易见的方法是使用标准的C或C++库,例如,<代码> SttoDo()/Cuff>。如果你真的想转换值,请看William Clinger的.< /P>
您在问题中没有指定“许多”,但请注意,double
只能准确地表示15位小数。实际上,std::numeric\u limits::digits10
。如果您的小数位数超过该位数,则需要对结果进行四舍五入
从实现的角度来看:一旦确定字符
c
是一个数字,就可以使用c-'0'
计算数字的值,也就是说,您可能希望将此公式与isdigit()
一起使用。此外,还可以使用pow()
相当昂贵,而且可能不如计算运行系数准确。也许您应该研究一下开关语法?例如开关(InStr[a]){case'1',case'2',等等…会有更少的冗余。Dat格式!Dat冗余!@Jean-MichaëlCelerier不太清楚。因为标准保证,数字-'0'
可以正常工作。你能详细说明一下出了什么问题吗
请!不清楚你在问什么。你的代码看起来很奇怪,但我看不出来现在有明显的错误!当我输入例如12.1234时,输出是相同的。但是当我输入12.123456789时,它返回值12.123457谢谢你的回答,但问题可能是程序必须计算通常的十进制数和标准化的十进制数之和。也就是说,0.1+2e^-2=0.12是否正确(@user2929512:至少可以说,处理浮点数并期望得到十进制数是很棘手的。将“0.12”
转换为1/10.0+2/100.0
可能会给出比计算为(1*10+2)更差的近似值。)/100.0
。问题是二进制浮点数通常不能表示十进制数,即在第一次计算中,该值可能四舍五入3次,而在计算中只四舍五入一次。@user2929512:您可能还想看看David Goldberg的。