使用临时变量格式化输出

jon*_*ndy 2 delphi delphi-2007

在保留一些代码时,我遇到了这样的声明:

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

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

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

当"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;
Run Code Online (Sandbox Code Playgroud)

小智 5

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