var  b17,b18,b19,b20,b21:double;  
begin          
         b17:=strtofloat(DBEditEh29.Text);  
         b18:=strtofloat(DBEditEh30.Text);  
         b19:=strtofloat(DBEditEh31.Text);  
         b20:=strtofloat(DBEditEh32.Text);  
         b21:=strtofloat(DBEditEh33.Text);  
if  b17  <  (b18+b19+b20+b21)  then  showmessage('数据不对?');  
end;  
我的核心程序就这几行。  
但是到执行的时候,整数可以,带小数的就不对了。
比如输入 100.85  10.05 40.2 40.2 10.4  
100.85=10.05+40.2+40.2+10.4就应该是恒等式,不会有问题啊。
但是老是弹出对话筐,说数据不对。郁闷。  
那位兄弟帮我看看,是什么问题呢?

解决方案 »

  1.   

    procedure TfrmMain.Button2Click(Sender: TObject);
    const
      nEQUAL = 1E-6;
    var
      dblTemp: Double;
    begin
      dblTemp := (10.06 + 40.2 + 40.2 + 10.4);
      if dblTemp - 100.85 > nEQUAL then
      ShowMessage('Please enter again!! ');
    end;
      

  2.   

    还是精度问题,我把以上数据的类型double改为comp就可以运行了。
      

  3.   

    有道理,减去一个极小值。我去try again
      

  4.   

    Double数据不能这样比较,虽然看起来相等,实际上是不等的,比较浮点类型的值应该允许有一个误差范围,只要两个数的差在一定的范围内,就认为它们是相等的,用function CompareValue(const A, B: Double; Epsilon: Double = 0): TValueRelationship;来比较,A,B为要比较的数,Epsilon是允许误差值,返回值为 -1:A<B, 0:A=B, 1: A>B
      

  5.   

    100.85=10.05+40.2+40.2+10.4就应该是恒等式?不是。swayi21(微斯人)的方法即可解决该问题。
     
      

  6.   

    谢谢各位,我知道原因了。 tjff2000(fengyun) 的方法也可以。
     swayi21(微斯人)也可以。
    但是,我还不明白comp是什么类型哦,pascal的类型好象没见过这类型哦。
      

  7.   

    The Comp (computational) type is native to the Intel CPU and represents a 64-bit integer. It is classified as a real, however, because it does not behave like an ordinal type. (For example, you cannot increment or decrement a Comp value.) Comp is maintained for backward compatibility only. Use the Int64 type for better performance.
      

  8.   

    Double数据不能这样比较,虽然看起来相等,实际上是不等的,比较浮点类型的值应该允许有一个误差范围,只要两个数的差在一定的范围内,就认为它们是相等的,用function CompareValue(const A, B: Double; Epsilon: Double = 0): TValueRelationship;来比较,A,B为要比较的数,Epsilon是允许误差值,返回值为 -1:A<B, 0:A=B, 1: A>BYou'd better only compare chars,integers using if(a==b)
    and compare float&double data using if(fabs(a-b)<1e-8)
     < and > has the same question.
      

  9.   

    Delphi中,StrToFloat()函数返回的是Extended数据类型,
    而你定义的 b17,b18,b19,b20,b21变量是double类型,
    Extended在系统中占用10字节,而Double只占用8字节。
    当你将Extende数据类型的值赋给Double型变量时,系统会强制类型转换,
    转换过程中,将产生误差。
    所以你只要将b17,b18,b19,b20,b21定义为Extended类型即可。
      

  10.   

    var  b17,b18,b19,b20,b21:currency;  
    是数据精度问题,在d6中我将数据类型改为currency即可,其他数据类型不行!
      

  11.   

    用currency可以,因为本来就是设计为精确到小数点后4位,你去看Delphi的帮助就知道了。
    我还用过别的法子,当然要知道需要精确到小数点后几位了,然后把这些值乘以10的n次方
    然后再转化为整数进行比较,这样就很方便了。
      

  12.   

    将你的程序稍微改一下即可
    var  b17,b18,b19,b20,b21:double;  
    begin          
             b17:=strtofloat(DBEditEh29.Text);  
             b18:=strtofloat(DBEditEh30.Text);  
             b19:=strtofloat(DBEditEh31.Text);  
             b20:=strtofloat(DBEditEh32.Text);  
             b21:=strtofloat(DBEditEh33.Text);  
    if  Trunc(b17*100)<Trunc((b18+b19+b20+b21)*100)  then  showmessage('数据不对?');  
    end;
      

  13.   

    浮点数的运用特别要小心,因为你在操作浮点数时,你给出的数可能是4位有效数字,
    但在机器中却是该类型数据的统一长度,如4.0,其实是4.0xxxxxxx……,有许多不可见
    部分。当你进行计算时,有时结果是不可知的(相对准确);我曾经用浮点数运算后进行大
    小比较,但怎么也不对,后来想办法转成整形的才通过。你可能遇到的也是此类问题。
    你可以人为的控制数据精度,如截取小数点后5位。delphi中有这样的函数(dataformat)
      

  14.   

    由于在计算机里的数是用二进制表示并进行运算的,所以你所看到的十进制的实数在计算机里转换为二进制后只不过是一个无限接近的它的近似数,同样,那么运算出来的结果也就只是一个近似数。如下面这个例子:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      aa,bb:double;
      cc:String;
    begin
      aa:=26;
      bb:=25.6;
      cc:=floattostr(aa-bb);
      showmessage(cc);
    end;
    它的结果就不是0.4而是3.9999999999999。
      

  15.   

    你用Double数据类型的时候就应该想到,
    "="号是绝对不能用的,应该用两个值相减的绝对值小于某个值来比较.