C中的总和不一致

时间:2012-05-21 23:08:36

标签: c floating-point floating-point-precision

当我运行以下程序时:

#include <stdio.h>
#include <math.h>

int main()
{
    double sum, increase;
    long amount, j;

    printf("sum = ");
    scanf("%lf", &sum);
    printf("increase = ");
    scanf("%lf", &increase);
    printf("amount = ");
    scanf("%ld", &amount);

    for (j = 1; j <= amount; j++)
    {
        sum += increase;
    }

    printf("%lf\n", sum);

    return 0;
}

我对这些值获得以下响应:

MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038851
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038852
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038853
432.438852

我在每种情况下都将变量'amount'增加了1。

  • 在第一个中,总和给出了我的期望。
  • 在第二个中,它出乎意料地给出了相同的价值。
  • 第三,它继续总结。

为什么会这样?

虽然代码看起来不是很有用,但我刚刚写了这个部分。我实际上想在更大的程序中使用它。

谢谢!

1 个答案:

答案 0 :(得分:3)

这是格式化问题,而不是数字问题。如果您将printf更改为

printf("%.12lf\n", sum);

结果看起来更符合您的预期:

sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198

最后的“垃圾”是由于浮点数的精度有限。