今天我正在尝试编写一个程序来总结用户输入的整数。例如,如果用户输入683
,则返回6 + 8 + 3 = 17。
但我在代码中遇到了一些奇怪的问题
using namespace std;
int computeSum(int num);
int computeInteger(int num, int position);
int main()
{
int num;
int sum;
int total;
cin >> num;
total = computeSum(num);
cout << total;
return 0;
}
int computeSum(int num)
{
int position = 10;
int temp = num;
double total = 0;
bool finish = false;
while(!finish)
{
total = total + computeInteger(num, position);
if(num/ position == 0)
break;
position *= 10;
}
return total;
}
int computeInteger(int num, int position)
{
double subtract1 = (double) num / position; //if num = 683 and position = 10 , this will get 68.3
int subtract2 = num / position; //if num = 683 and position = 10 , this will get 68
double solution = subtract1 - subtract2; //take 68.3 - 68 = 0.3
return (int)(solution * 10); // return 0.3 * 10 = 3 , but instead of getting 3 this program return 0.3 * 10 = 2
}
computeInteger
,而不是获取最后一个数字3,我得到2作为返回值。这是非常奇怪的,因为我认为截断只会移除浮动部分而不会进行任何向上或向下舍入。当我测试代码cout << (int)(0.3 * 10)
时,我确实得到3,但不是在上面的代码中。这让我感到困惑。答案 0 :(得分:5)
double subtract1 =(double)num / position; //如果num = 683且position = 10,这将得到68.3
这不完全正确,0.3不是基数2中的有理数,它将非常接近0.3但是数字总是向下舍入,以缩小你可以将它投入浮动的错误或long float但不是这种情况,因为在你的例子中它总是0.29,如果你想了解真正发生了什么,你必须阅读计算机中的数字表示,这里有很好的描述:
http://en.wikipedia.org/wiki/Computer_number_format
您遇到的错误是众所周知的错误,也在维基页面中描述:
http://en.wikipedia.org/wiki/Round-off_error
和Stack链接:
答案 1 :(得分:5)
在浮点数中,68.3不是68.3,而是更像68.299999997。阅读floating point rounding errors。
答案 2 :(得分:1)
让浮点数偏离:
inline int computeInteger(int num, int position) {
return (num / (position / 10)) % 10;
}
答案 3 :(得分:1)
此计算无需使用浮点数。将computeSum
和computeInteger
替换为:
int computeSum(int num)
{
int sum = 0;
for (; num; num /= 10)
sum += num % 10;
return sum;
}
注意:您的代码允许num
为负值。如果您想支持这些,则需要添加其他代码。
答案 4 :(得分:0)
是的,你说得对.2。让我解释原因: 如果num = 683,我会告诉你调试器对你的comuteInteger函数的值所说的内容:
double subtract1 = (double) num / position; // substract1=68.299999999999997
int subtract2 = num / position; // subtract2 = 68
return (int)(solution * 10); // 2.99999999999997 casted to int will be 2
这是第一步......
答案 5 :(得分:0)
如果我必须做类似的事情,我将创建一个递归函数,如下所示:
int total(int num){
if(num == 0){
return 0;
}else{
return num%10 + total(num/10);
}
}
答案 6 :(得分:0)
选择数字的常用方法是使用n % 10
获取最低位的值,然后n /= 10
删除最低位。重复直到完成。