有人可以向我解释为什么浮动x = 0.1*7不会导致x == 0.7为真?

The*_*ist -2 c++ floating-point

编辑:这里有很多不满的成员,因为这个问题在网站上有重复.在我的辩护中,我尝试首先搜索答案,也许我使用的搜索关键字很差,但我找不到这个特定代码示例的直接,明确的答案.我很少知道**2009**中有一个会从那里链接到那里.

这是一个编码示例:

#include <iostream>
using namespace std;

int main() {
    float x = 0.1 * 7;
    if (x == 0.7)
        cout << "TRUE. \n";
    else
        cout << "FALSE. \n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这导致FALSE.但是,当我输出x时,确实输出为0.7.说明?

Jos*_*eld 7

请阅读每个计算机科学家应该知道的关于浮点运算的内容.

首先,0.1是一个字面的类型double.IEEE 754双精度中最接近可表示的值为0.1:

0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

如果将其乘以7,则IEE 754单精度中最接近的可表示值(因为您将其存储在a中float)是:

0.699999988079071044921875
Run Code Online (Sandbox Code Playgroud)

如你所见,这几乎是0.7,但并不完全.然后将其转换为a double进行比较,最后比较以下两个值:

0.699999988079071044921875 == 0.6999999999999999555910790149937383830547332763671875
Run Code Online (Sandbox Code Playgroud)

当然评估为false.