delphi - 使用临时变量改变格式化输出

标签 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。这导致了其他问题。

没想到使用这个临时变量会出现这样的问题。谁能解释这里发生了什么? future 避免这种情况的最佳做法是什么?

这说明了问题:

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;

最佳答案

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

关于delphi - 使用临时变量改变格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21910231/

相关文章:

delphi - 如何访问嵌套样式控件

delphi - 阻止 VCL 子控件继承父弹出菜单

德尔福 2007 和 Windows 7 : Debugger fails to stop host application

delphi - 强制将 Real 的默认值写入 WriteComponent()

delphi - 如何调用 ASP web api 并从 delphi 2007 返回 JSON

delphi - 子窗体始终位于主窗体上方

delphi - 未收到使用 Indy 发送的 JSON,因为它是由 Stripe API 发送的

delphi - 如何在使用 Delphi XE2 进行 iPhone 开发的 Free Pascal 中包含 Objective C 文件

delphi - 调整列宽 DBGrid

c++ - 在 firemonkey 中加载一个 dylib