C中的不一致求和

C中的不一致求和,c,floating-point,floating-point-precision,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

当我运行以下程序时:

#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;
}
其中,我在每种情况下都将变量“金额”增加了1

  • 在第一个例子中,求和给出了我所期望的结果
  • 在第二种情况下,它令人惊讶地给出了相同的值
  • 在第三部分,它继续求和
为什么会发生这种情况

虽然代码似乎不是很有用,但我刚刚编写了有问题的部分。实际上我想在更大的程序中使用它


谢谢

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

printf("%.12lf\n", sum);
结果看起来更符合您的预期:

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

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

你忘了实际问题了吗?浮点数的精度有限,我会在某个地方失去足够的精度,结果是相同的。每一位计算机科学家都应该知道的关于浮点运算的知识——我很想投票把它作为的副本来结束,因为它几乎是一样的。我不这样做的唯一原因是,链接问题中的代码质量太差,而您的代码至少可读性和简洁性很强。:)这是您在ideone上稍加修改的程序。
sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198