为什么以下变量分配不能正常工作?

时间:2019-10-26 19:20:57

标签: c++ visual-studio-code c++14

我试图通过将每个字符转换为int并乘以其对应的指数,将用户输入从字符串转换为int。一切正常,直到需要将结果值分配给int变量为止。当分配的值在100到1000之间时,它总是比正确值小1。 即int k=0; k+=100;但打印k时显示99。但是k+=1000可以正常工作。

我发现的解决方案是更改被乘数和乘数的顺序,但这种情况的原因仍然未知。

string k_input;
cin >> k_input;
int k = 0;
for (int i = 0; i < k_input.length(); i++)
{
    cout << (k_input[i] - '0') << " " << pow(10, (k_input.length() - i) - 1) << endl;

    k += (k_input[i] - '0') * pow(10, k_input.length() - i - 1);
}

即输入123,输出应为123,但改为显示122。

输入1221会显示1221如预期。

1 个答案:

答案 0 :(得分:1)

这个问题很可能是编译器和/或平台特定的,几乎可以肯定地归结为将计算的double输出转换为int值时出现的“舍入”错误。您可以使用lround函数(在<cmath>中定义)来解决此问题:

k += lround((k_input[i] - '0') * pow(10, k_input.length() - i - 1));

顺便说一句,打开编译器警告会突出显示这样的问题!对于您的代码,在Visual Studio中显示给我:

warning C4244: '+=': conversion from 'double' to 'int', possible loss of data