这么一段简单的代码,
procedure TMainForm.Button6Click(Sender: TObject);
var  f1,f2:real ; i,j:integer;
begin
  f1:=35.43;
    f2:=f1-35.0;  i:=trunc(Frac(f2)*10);
  j:=trunc(Frac(f2*10)*10);
  showmessage(inttostr(i));
  showmessage(inttostr(j));
end;
自己手算 应该分别是4和3  但是运行显示的却是4和2
请问是怎么回事啊???????????????怎么样能够得到正确的答案呢?

解决方案 »

  1.   

    实型数的误差。3变成了2.9999999...  用Trunc截尾取整就变成2了,改用Round来取整吧
      

  2.   

    Real类型有它的特殊性,0.43它可能存储为0.4299999999997,类似于0.43,所以就有这种错误。
    你可以自己看看
      showmessage(Floattostr(Frac(f2*10)));  showmessage(inttostr(i));
      showmessage(inttostr(j));
      

  3.   

    但是round 经过了4舍五入阿
      

  4.   

    够龌龊 但我也只能这样了
    help!
      

  5.   

    var  f1,f2:real ; i,j:integer;
    begin
      f1:=35.43;
        f2:=f1-35.0;  i:=trunc(Frac(f2)*10);
      j:=trunc(Frac(f2*10)*10);
      showmessage(floattostr((Frac(f2)*10)));
      showmessage(floattostr((Frac(f2*10)*10)));  showmessage(inttostr(i));
      showmessage(inttostr(j));
    end;
    好像是有问题啊,向大家学习中
      

  6.   

    我也有个土办法,加个数修正
      f1:=35.43;
        f2:=f1-35.0;
      f2:=f2+0.000000000000001;
      i:=trunc(Frac(f2)*10);
      j:=trunc(Frac(f2*10)*10);
      showmessage(inttostr(i));
      showmessage(inttostr(j));
      

  7.   

    ...
    var delt:real;
    ...
     delt:=1e-12;  
     i:=trunc(Frac(f2)*10+delt);
     j:=trunc(Frac(f2*10)*10+delt);