我试图通过将每个字符转换为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如预期。
答案 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