0

今天我正在尝试编写一个程序来总结用户输入的整数。例如,如果用户输入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
 }

问题

  1. 在上面的代码中,当我为函数输入 683 时,我computeInteger没有得到最后一个数字 3,而是得到 2 作为返回值。这很奇怪,因为我认为截断只会删除浮动部分而不会向上或向下进行任何舍入。当我测试代码cout << (int)(0.3 * 10)时,我确实得到了 3 ,但在上面的代码中没有。这让我很困惑。
4

7 回答 7

5

双减1 =(双)数量/位置;//如果 num = 683 和 position = 10 ,这将得到 68.3

这并不完全正确,0.3 不是以 2 为底的有理数,它会非常接近 0.3 但会更小,因为数字总是向下舍入,为了缩小错误,您可以将其转换为 float 或 long float 但是这不是一种情况,因为在您的示例中它将始终为 0.29,如果您想了解实际发生的情况,您必须阅读有关计算机中的数字表示的信息,这里有很好的描述:

http://en.wikipedia.org/wiki/Computer_number_format

您遇到的错误也是wiki页面中描述的众所周知的错误:

http://en.wikipedia.org/wiki/Round-off_error

和堆栈链接:

什么是浮点/舍入误差的简单示例?

于 2013-09-06T08:40:52.340 回答
5

在浮点数中,68.3 不是 68.3,而是更像 68.299999997。阅读浮点舍入误差

于 2013-09-06T08:41:08.093 回答
1

There is no need to use floating-point for this calculation. Replace computeSum and and computeInteger with:

int computeSum(int num)
{
    int sum = 0;
    for (; num; num /= 10)
        sum += num % 10;
    return sum;
}

Note: Your code permits negative values for num. If you want to support those, you will need to add additional code.

于 2013-09-06T15:10:56.920 回答
1

摆脱浮点数:

inline int computeInteger(int num, int position) {
    return (num / (position / 10)) % 10;
}
于 2013-09-06T08:52:39.850 回答
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

这是第一步。。

于 2013-09-06T08:48:04.423 回答
0

拾取数字的常用方法是使用n % 10获取最低位的值,然后n /= 10删除最低位。重复直到完成。

于 2013-09-06T13:27:46.323 回答
0

如果我必须做类似的事情,我将创建一个递归函数,如下所示:

int total(int num){
if(num == 0){
    return 0;
}else{
    return num%10 + total(num/10);
}
}
于 2013-09-06T10:13:02.640 回答