在c ++中将带小数位的数字从char转换为int

时间:2014-05-24 02:48:43

标签: c++

我正在玩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。

2 个答案:

答案 0 :(得分:1)

您需要strtod,而不是strtolstrtol仅解析整数。

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;
}

......但可能有更好的方法