为什么以下代码中没有== 0?

use*_*940 2 c

#include <stdio.h>
int main( )
{
    float a=1.0;
    long i;

    for(i=0; i<100; i++)
    {
        a = a - 0.01;
    }
    printf("%e\n",a);
}
Run Code Online (Sandbox Code Playgroud)

结果是:6.59e-07

Dir*_*mar 11

它是一个二进制浮点数,而不是十进制数 - 因此您需要预期舍入错误.请参阅本文的基本部分:

每个程序员应该知道的浮点运算

例如,值0.01在二进制浮点类型中没有精确的表示.要在样本中获得"正确"结果,您必须舍入或使用十进制浮点类型(请参阅Wikipedia):

二进制定点类型是最常用的,因为重新缩放操作可以实现为快速位移.二进制定点数可以精确地表示两个的分数幂,但是,像二进制浮点数一样,不能精确地表示十的分数幂.如果需要精确的十分之一幂,则应使用十进制格式.例如,十分之一(0.1)和百分之一(0.01)只能通过二进制定点或二进制浮点表示来近似表示,而它们可以精确地表示为十进制定点或十进制浮点表示.这些表示可以以多种方式编码,包括BCD.