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

时间:2011-04-28 09:36:48

标签: 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);
}

结果是:6.59e-07

5 个答案:

答案 0 :(得分:11)

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

  

<强> What Every Programmer Should Know About Floating-Point Arithmetic

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

  

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

答案 1 :(得分:3)

这里有两个问题。如果您问,为什么我的printf语句将结果显示为6.59e-07而不是0.000000659,这是因为您已使用format specifier表示科学记数法:%e。您希望%f用于浮点a

printf("%f\n",a);

如果你问为什么结果不是完全为零而不是0.000000659,答案是(正如其他人已经指出的那样)使用二进制数进行浮点运算需要进行舍入。

答案 2 :(得分:1)

您必须指定%f来打印浮点数,然后它将为变量a打印0。

答案 3 :(得分:0)

这是浮点数在场景中舍入错误。每次减去一个分数时,你得到的结果大致是你通常从纸上数字得到的结果,因此最终结果非常接近零,但不一定是精确的零。

答案 4 :(得分:0)

浮点数的精度不准确,这就是你找到这个结果的原因。

亲切