我正在玩VS 2012并且遇到了一个非常棘手的问题(至少对我而言)。我有一个简单的程序,它对命令行的输入进行数学运算。但是,如果在程序中的某处输入带小数位的参数,它似乎会忘记小数位后面的数字。
double add (char const *inp, char const *inp2) { //addition function
double val = std::strtol(inp, NULL, 0);
double val2 = std::strtol(inp2, NULL, 0);
return val + val2;
}
然后调用函数:
double result = add(argv[1], argv[2]);
printf("%f \n", result);
并从命令行调用
test 52.2 44.6
返回96而不是96.8。
答案 0 :(得分:1)
您需要strtod
,而不是strtol
。 strtol
仅解析整数。
strtod
只接受两个参数,因为浮点数始终位于基数10(无论如何,就strtod
而言。)
答案 1 :(得分:0)
我认为你正在把你的字符串变成多头(我猜测那是什么strtol()......)。我正在构建一个计算器,我遇到了这个问题 - 我写了一个函数给handel它:
double string_to_double(string str)
{
int length = (int)str.length();
double output = 0; //This holds value of output. Will be added for each 10's digit
int decimalPos = length - 1;
for (int i = 0; i < length; i++)
{
if(str.at(i) == '.') // Find if there is a decimal point
{
decimalPos = i - 1; //Sets Decimal Position
str.erase(str.begin()+i);
length--;
}
}
for (int i = 0; i < length; i++)
{
switch (str.at(i))
{
case '1':
output += 1*pow(10, decimalPos - i);
break;
case '2':
output += 2*pow(10, decimalPos - i);
break;
case '3':
output += 3*pow(10, decimalPos - i);
break;
case '4':
output += 4*pow(10, decimalPos - i);
break;
case '5':
output += 5*pow(10, decimalPos - i);
break;
case '6':
output += 6*pow(10, decimalPos - i);
break;
case '7':
output += 7*pow(10, decimalPos - i);
break;
case '8':
output += 8*pow(10, decimalPos - i);
break;
case '9':
output += 9*pow(10, decimalPos - i);
break;
case '0':
break;
}
}
return output;
}
......但可能有更好的方法