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

chi*_*lia 5 c c++

我写了以下C++代码:

float a, b;
int c;

a = 8.6;
b = 1.4;
c = a + b;

printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)

输出是10.

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

float a, b;
int c;

a = 8.7;
b = 1.3;
c = a + b;

printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)

输出是9.

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

Die*_*Epp 15

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

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

不要使用浮点数来赚钱.

#include <stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)

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

Looks like: 8.7 + 1.3 = 10.0
The truth: 8.69999980926513671875 + 1.29999995231628417969 = 9.99999976158142089844

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

Looks like: 8.7 + 1.3 = 10.0
The truth: 8.69999980926513671875 + 1.29999995231628417969 = 10.00000000000000000000

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

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

  • 不要使用**二进制**浮点钱.十进制浮点被精确地标准化用于金融应用. (2认同)