var 
  a:real;
begin
  a:=0.4;
  if a<=0.4 then
  .......
end;跟踪a<=0.4 结果为false,为何?

解决方案 »

  1.   

    不清楚为什么会这样把a声明为extended可正常
      a: extended另外我试了C++Builder,有同样问题
    必须
    double a=0.4 ;
      if (a <= 0.4)
    或者
    float a=0.4;
    if(a <= (float)0.4)
    才行C#也这样
    float a=0.4F;
    if(a<=0.4)
    也不行
      

  2.   

    我也遇到相同问题,如round(2.5)=2,关注
      

  3.   

    real类型当你a:=0.4的时候,有时好像存放的是0.39???????的
      

  4.   

    我觉得这可能是由于作为一个real型变量,不管你是如何的赋值,他生来并不是一个real型,而是由其他的类型转换而来,在这个过程中由于转换和存储空间的不同就产生了一些误差,学过谭浩强那本c语言的兄弟们还记不记得有一个例子,就是算了半天(好像是“除”)算出来的不是一个我们想要的数,而是在小数点之后的若干位后面就偏离了正确的结果,我想现在我们碰到的就是这个问题,我通常当只要小数点后不超过四位的real型统统定义为currency型,这种类型精度很高,超过四位的的定义成Extended,这是最强劲的赋点数类型了,在通过其他方法截到需要的长度,不过这样可移植性不好
      

  5.   

    这不是Delphi的BUG,这是由于浮点数在计算机的表达方式造成的。C也是这样,任何语言都是这样,只要是采用相同的浮点数在计算机的表达方式!
    作为浮点数的比较方法,均是采用差值比较法,比如,判断一个浮点数是否和0.4相等,因改采用 if (abs(a-0.4) < 0.000000001)这是浮点数比较的基本常识。浮点数在计算机的表达方式大家可以去查一下计算机组成原理等一些数,或在网上查找一下,我就不多说了
      

  6.   

    对楼上的答复偶比较满意。
    浮点数好象都是精确到小数点后面某个位的
    其实Extended类型也有这种问题,它也是REAL类型。
    但不明白为什么你要精确到小数点后0.000000001才算是相等,为什么长一点或短一点就不行呢?
      

  7.   

    这个问题我也试过了,但是当你定义两个变量时
    把两个变量都赋值为0.4时就可以,即使是一个定义为real型,一个定义为Currency也可以的
      

  8.   

    不是BUG
    Real 类型在Delphi 2 和 Delphi 3 中的定义与 16 位版本一样,都占 6 个字节。不过Borland公司一直不提倡使用这种类型,而建议用Single、 Double、 Extended 类型代替。这是由于 Real 这种 6 字节的旧格式既不受 Intel CPU 的支持,又没有列在官方的IEEE 实型中。为了完全解决这一问题,Delphi 4 不得不修改 Real 类型的定义,将其改成标准的 8 字节浮点型, 由此引起了兼容性问题,不过如果有必要,你可以采用下面编译指令克服兼容性问题,恢复Delphi 2 和 Delphi 3 的Real 类型定义:{$REALCOMPATIBILITY ON}对实型数据,我们没办法编一个类似Range的程序,因为High 、Low及 Ord函数不能用于实型值。理论上说实型类型代表一个无限的数字集合;有序类型代表一个有限的数字集合。注意:让我进一步把上述问题解释一下。对于整数 23,你能确定23 后面的数是什么 ,因为整型数是有限的,它们有确定的值域范围及排列顺序。而浮点数即使在一个很小的值域范围内也无限、无序。 事实上,在 23 和 24 之间有多少值? 哪个值是 23.46 后面的值? 23.47 还是 23.461,或者 23.4601? 这是很难说清的。
      

  9.   

    天哪,又一个说delphi的Bug 的人,
      

  10.   

    TO SS2000(SS2000):
    if (abs(a-0.4) < 0.000000001)
    我试到了小数点后面第13位还是为false;<0.1也是false,它是不是无穷小啊?
      

  11.   

    不管为何,总有一种方法能够让浮点数与浮点数之间进行比较吧,比如一种很愚蠢的方法
    var
     a,b:real;
    begin
     a:=0.4;
     b:=0.4;
     if b<=a then 
      ......
    end;
    这种方法可以,但如果0.4是做常数用的啊,如果我的常数多了,有很多比较的区间,这种方法就不可取了,有哪位大侠能出高招啊?
      

  12.   

    怎样将一个浮点常数强制转换为REAL类型?