//本次核销金额不能大于 单据金额-已核销金额
          //明细本次核销金额大于零,注意在生成红单的时候,金额乘以hlbz,
          //因为从视图取数,视图中的金额都已经乘以了hlbz,金额变为了负数
          d_bchxje:=CDS_Bottom.FieldByName('BchxJe').AsFloat;//明细本次核销金额
          d_YsfkJe:=CDS_Bottom.FieldByName('YsfkJe').AsFloat;//明细单据金额
          d_Yhxje:=CDS_Bottom.FieldByName('Yhxje').AsFloat;//已核销金额
          pfun.ShowMessageOK(floattostr(d_bchxje));
          pfun.ShowMessageOK(floattostr(d_YsfkJe-d_Yhxje));
          //if (CDS_Bottom.FieldByName('BchxJe').AsFloat)> (CDS_Bottom.FieldByName('YsfkJe').AsFloat-CDS_Bottom.FieldByName('Yhxje').AsFloat) then
          if d_bchxje > (d_YsfkJe-d_Yhxje) then
            pfun.ShowMessageOK('wxy');
            result:='第'+inttostr(i_xh)+'行本次核销金额不能大于未核销金额!';
            CDS_Bottom.EnableConstraints;
            dxDBBottom.SetFocus;
            dxDBBottom.FocusedField := dxDBBottom.FindColumnByFieldName('BchxJe').Field;
            exit;
          end;
问题:          d_bchxje:=CDS_Bottom.FieldByName('BchxJe').AsFloat;//明细本次核销金额
          d_YsfkJe:=CDS_Bottom.FieldByName('YsfkJe').AsFloat;//明细单据金额
          d_Yhxje:=CDS_Bottom.FieldByName('Yhxje').AsFloat;//已核销金额这三个变量在delphi中定义的都是double型。从cds取出数,比较d_bchxje > (d_YsfkJe-d_Yhxje)大小。
showmessage()看到的值是相等的,但实际程序走了大于.可能和BCD有关或其他原因。

解决方案 »

  1.   

    显示出来的二者是相等的,比较却走大于很正常啊,浮点数的相等比较是不准确的,但是大于或者小于还是准确的,所以要判断是否相等可以这样:if not ((a > b) or (a < b)) then。也就是a 不大于 b同时a 不小于b就是相等的,否则就是不相等!
      

  2.   


     if   d_bchxje   >   (d_YsfkJe-d_Yhxje)   then //好像少了begin吧
                           begin
                            pfun.ShowMessageOK('wxy'); 
                            result:='第'+inttostr(i_xh)+'行本次核销金额不能大于未核销金额!'; 
                            CDS_Bottom.EnableConstraints; 
                            dxDBBottom.SetFocus; 
                            dxDBBottom.FocusedField   :=   dxDBBottom.FindColumnByFieldName('BchxJe').Field; 
                            exit; 
                        end; 
      

  3.   

    浮点数运算误差?
    StrToFloat(FloatToStr(d_bchxje))
      

  4.   

    我上面已经说了,浮点数的大于或小于比较是准确的,既然你的代码运行已经走了大于,那就是大于,不能因为“showmessage()看到的值是相等的”而否定大于结果,你看到的是四舍五入后的结果。
      

  5.   

    用Extended类型对应Float 不要用Dobule
      

  6.   

    呵呵,lz是做哪家的ERP呢,还是财务模块.
    这个是Delphi的浮点数存储问题,浮点数在计算机的存储是不精确的存储,比如1,在计算机中存储的可能是1.0000000001,也可能是0.9999999999等等.并不一定是精确的1.0000000000,因此比较浮点数不可以直接用 a = b 来比较,应该用 a - b < 0.00000001 来比较,这后面的值主要根据你允许的误差范围来,但是不能比0.00000001再小,否则比较会不准确,原因是Delphi的Float类型的误差本身可能会超过比它小的值.
    想看浮点数的真实值,用Delphi的调试器是不行的,Delphi的调试器显示很不精确,可以用ShowMessageFmt('%.13f', [a]),将显示精度调大点就可以看到里面存的真实值了 :)
      

  7.   

    涉及货币的话,应该用Currency吧。
    用Float,Extended,Double迟早有人会找你麻烦。