使用临时变量格式化输出

时间:2014-02-20 14:08:26

标签: delphi delphi-2007

在保留一些代码的同时,我发现了这句话:

 sActDiln := Format('%.*f',[tdDigits.ndd, Fields[itd].AsFloat * rfc / 100]);

为了看看发生了什么,我添加了一个DOUBLE类型的临时变量(actDiln),并按如下方式更改了代码:

 actDiln := Fields[itd].AsFloat * rfc / 100;
 sActDiln := Format('%.*f',[tdDigits.ndd, actDiln]);

当" Fields [itd] .AsString"是35和" rfc"是109,计算值从38.15变为38.14999999。当小数位数为1时,则将计算值从38.2更改为38.1。这引起了其他问题。

我没想到使用这个临时变量会导致这样的问题。谁能解释一下这里发生了什么?为避免这种情况,未来的最佳做法是什么?

这表明了问题:

Uses DB, DBISAMTb;

procedure TForm1.FormShow(Sender: TObject);
   var
      t : TDBISAMTable;
      actDiln, rfc : double;
      actDilnE : extended;
      sActDiln1, sActDiln2, sActDiln3 : string;
   begin
   t := TDBISAMTable.Create(Application);

   WITH t DO BEGIN
      TableName := 'xxx';
      DataBaseName := 'Study';

      Active := False;
      Exclusive := False;
      IF Exists THEN DeleteTable;

      WITH FieldDefs DO BEGIN
         Clear;
         Add('fld', ftString, 10, False);
         END;
      WITH IndexDefs DO BEGIN
         Clear;
         END;
      CreateTable;
      Exclusive := True; //<<<<<<<<<<<<<
      IndexName := '';
      Open;
      Append;
      FieldByName('fld').AsString := '35';
      Post;

      rfc := 109;

      actDiln := Fields[0].AsFloat * rfc / 100;
      sActDiln1 := Format('%.*f',[1, Fields[0].AsFloat * rfc / 100]);
      sActDiln2 := Format('%.*f',[1, actDiln]);
      actDilnE := Fields[0].AsFloat * rfc / 100;
      sActDiln3 := Format('%.*f',[1, actDilnE]);
      ShowMessage(sActDiln1 + ' vs ' + sActDiln2 + ' vs ' + sActDiln3);
      end;
   end;

1 个答案:

答案 0 :(得分:5)

内联浮点计算通常是扩展类型。检查中间变量也是扩展时的行为。