为什么54 + 400 = 453?

时间:2019-06-03 17:06:53

标签: c++

我想将字符串转换为整数,然后发现“ 454”被转换为453。

我已经定义了一个函数,可以将整数字符串转换为整数。但是当我测试它时,发现“ 454”被转换为453。我尝试了另一个数字565,它是正确的。

#include <iostream>
#include <string>
#include <math.h>

using namespace std;

int strtonum(string num){
    int i = 0;
    int n = 0;
    int result=0;
    for(i = num.length()-1; i>=0; i--,n++){
        if(num[i] == '-'){
        result-=2*result;
        break;
        }
        cout<<result<<" + "<<(num[i] - '0')*pow(10,n);
        result += (num[i] - '0')*pow(10,n);
        cout<<" = "<<result<<endl;
    }
    return result;
}

int main()
{
    string x;
    cin>>x;
    cout<<strtonum(x)<<endl;
    return 0;
}

结果

454
0 + 4 = 4
4 + 50 = 54
54 + 400 = 453
453

Process returned 0 (0x0)   execution time : 2.763 s
Press any key to continue.  

565
0 + 5 = 5
5 + 60 = 65
65 + 500 = 565
565

Process returned 0 (0x0)   execution time : 3.314 s
Press any key to continue.

2 个答案:

答案 0 :(得分:1)

您的方法涉及通过使用std::pow函数来进行浮点计算。

您可能知道,浮点计算会引入错误。看到这里有很好的健康整数,我感到有些惊讶,但是在截断到int之前,您仍然根本不处理它。

我建议将整数提高为10(也许是一个不错的循环!)。

而且,正如布鲁诺指出的那样:

result-=2*result;

容易溢出,因此只需执行以下操作即可:

result = -result;

或:

result *= -1;

答案 1 :(得分:0)

通常的方法是通过乘以10来累加值:

int convert(std::string text) {
    bool negative = false;
    int cur = 0;
    if (text[cur] == '-') {
        negative = true;
        ++cur;
    }
    int value = 0;
    while (cur < text.length()) {
        value *= 10;
        value += text[cur++] - '0';
    }
    if (negative)
        value = -value;
    return value;
}

注意:此代码尚未经过测试。它可能包含错误。