添加两个浮点数时出现意外输出

我写了以下C ++代码:

float a, b; int c; a = 8.6; b = 1.4; c = a + b; printf("%d\n", c); 

输出为10

但是当我运行以下代码时:

 float a, b; int c; a = 8.7; b = 1.3; c = a + b; printf("%d\n", c); 

输出是9

这两者有什么区别,因为它们提供不同的输出?

浮点数没有8.7或1.3这样的数字。 有一个数字10,数字-6.5和数字0.96044921875 ……但没有8.7或1.3。

充其量,您的计算机可以将8.7舍入到最近的浮点数,并将1.3舍入到最近的浮点数。 计算机将这些舍入的数字相互添加,然后对结果进行舍入

不要使用浮点数来赚钱。

 #include  int main(int argc, char *argv[]) { float a = 8.7, b = 1.3; printf("Looks like: %.1f + %.1f = %.1f\n", a, b, a+b); printf("The truth: %.20f + %.20f = %.20f\n", a, b, a+b); return 0; } 

在x86 GCC / Linux计算机上,我得到了结果:

看起来像:8.7 + 1.3 = 10.0
真相:8.69999980926513671875 + 1.29999995231628417969 = 9.99999976158142089844

在PPC GCC / OS X计算机上,我得到了结果:

看起来像:8.7 + 1.3 = 10.0
真相:8.69999980926513671875 + 1.29999995231628417969 = 10.00000000000000000000

注意在这种特殊情况下8.7和1.3是如何向下舍入的。 如果您选择了向上舍入的数字,您可能会在右侧看到大于10的数字。

请参阅David Goldberg撰写的“每个计算机科学家应该知道的关于浮点算术的内容” ( 链接 )。

浮点数与实数不同,它们的行为完全不同。

实数是无限的,而浮点数是有限的,只能代表所有可能实数的一小部分。

由于并非所有实数都可以表示为浮点数,因此浮点赋值或运算可能会给出与实数空间中相同的结果。

有关简介,请参阅浮点上的维基百科条目 。 关于浮点精度的部分特别有趣,并提供了与您类似的其他示例。

这两者之间没有真正的区别。 它们的行为方式都是不可预测的。

你正在做的事情相当于两次掷硬币,并且问你做了什么不同的事情,让你有一次头和另一头。 这不是你做了什么不同的事情,而是当你翻转硬币时会发生这种情况。

如果你要求一个人使用6位十进制精度添加三分之一和三分之二然后向下舍入到一个整数,你可能得到0并且你可能得到1.这将取决于它们是否代表2/3为“0.666666” “或”0.6666667“并且它们都是可以接受的。 所以0和1都是可接受的答案。 如果您不准备接受任何一个答案,请不要问这样的问题。