基本转换器功能问题

时间:2017-01-21 20:56:29

标签: c++

我正在帮助一位有C ++作业的朋友。下面的基本转换器功能存在问题:

#include <iostream>
#include <cmath>
using namespace std;

int strToInt(string num, unsigned base){
    int result = 0;
    for (int i=0; i<num.length(); i++) {
        if (num[i]>='0' && num[i]<='9')
            result += (num[i]-'0')*pow(base,num.length()-i-1);
        else if (num[i]>='A' && num[i]<='F')
            result += (num[i]-'A'+10)*pow(base,num.length()-i-1);
        else if (num[i]>='a' && num[i]<='f')
            result += (num[i]-'a'+10)*pow(base,num.length()-i-1);
    }
    return result;
}

int main()
{
    string number;
    int base;
    while(number.compare("exit")!=0){
        cin>>number;
        cin>>base;
        cout<<strToInt(number,base)<<"\n\n";
    }
    return 0;
}

由于某些莫名其妙的原因,每当我输入3位和5位小数并选择基数10时,我得到正确的数字-1。

E.g。

100
10
99

10000
10
9999

我在过去的5-6小时内一直在使用这个功能,并添加了所有类型的调试代码,但为了我的利益,我无法弄清楚到底是什么问题。

代码风格备注也非常受欢迎。

干杯

1 个答案:

答案 0 :(得分:2)

std::pow进行浮点数学运算。你可能在某处得到了一个圆整错误。累积值的常用方法是在循环中每次乘以并添加:

result *= base;
result += ch - '0';