经过四舍五入处理的两个相同数字float型,在下面情况下不相等:
var 
  a,b :real;
if a = b then
  .....
我在单步运行中看到a和b都是2.04,但他就是返回false,奇怪!

解决方案 »

  1.   

    你试一下用Double的类型呢
    还有你没有定义初始值呀
      

  2.   

    有初始值,在这我没写,
    function TPUMCredenceFrm.equal: boolean;
    var
      sumj,sumd : real;
      i : integer;
    begin
      sumj := 0;
      sumd := 0;
      dmPUCredence.adryDetilQuery.First;
      for i := 0 to dmPUCredence.adryDetilQuery.RecordCount -1 do
      begin
        sumj := sumj + dmPUCredence.adryDetilQuery.FieldByName('MoneyAmountDr//金额').AsFloat;
        sumd := sumd + dmPUCredence.adryDetilQuery.FieldByName('MoneyAmountCr//金额').AsFloat;
        dmPUCredence.adryDetilQuery.Next;
      end;
      if sumd = sumj then
      begin
        equal := true;
      end
      else
      begin
      equal := false;
      end;
    end;
    以上是完整的函数,金额是两位小数,运行后sumd = sumj都等于2.04,但就是返回false我要是手工把sumd 和sumj都减0.1之后就返回真了。
      

  3.   

    比较 real 的还是应该加上一个范围比较好
     if (a-b < 0.0000001) then
     begin
     end;
      

  4.   

    real不应这样比较大小,他们看来相等,其实不等的,因为有精度的问题在
      

  5.   

    由于2进制和10进制转化是浮点数存在精度问题,所以通常的浮点书比较是采用 差的绝对值小于允许误差的方式浮点数a, b, 允许误差 deta
    那么写作if (abs(a-b)<deta)
      //认为相等楼上的写法有点问题,应该加上绝对值if (abs(a-b) < 0.0000001) then
     begin
     end;
      

  6.   

    uses math;
      ....
      if abs(sumd-sumj)<0.001 then
      begin
        equal := true;
      end改成这样就行了