当我运行以下程序时:
#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
在每种情况下,我都将变量“数量”增加了 1。
- 在第一个中,总和给出了我的预期。
- 在第二个中,它令人惊讶地给出了相同的值。
- 在第三个中,它继续求和。
为什么会这样?
虽然代码看起来不是很有用,但是我只是把有问题的部分写出来了。我实际上想在更大的程序中使用它。
谢谢!
最佳答案
这是格式问题,而不是数字问题。如果将 printf
更改为
printf("%.12lf\n", sum);
结果看起来更符合您的预期:
sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198
最后的“垃圾”是由于 float 的精度有限。
关于c - C 中不一致的求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10693777/