为什么以下变量分配不正确



我试图通过将每个字符强制转换为int并乘以其相应的指数,将用户输入从字符串转换为int。一切都正常工作,直到我需要将结果值分配给int变量为止。当指定的值在100和1000之间时,它总是比正确的值少一个。即CCD_ 4,但是打印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。

这个问题很可能是编译器和/或平台特定的,几乎可以肯定是由于将计算的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

最新更新