Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用临时变量更改格式化输出_Delphi_Delphi 2007 - Fatal编程技术网

Delphi 使用临时变量更改格式化输出

Delphi 使用临时变量更改格式化输出,delphi,delphi-2007,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]); 当“

在维护一些代码时,我遇到了以下语句:

 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.1499999。当小数位数为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;
使用DB,DBISAMTb;
程序TForm1.FormShow(发送方:TObject);
变量
t:TDBISAMTable;
actDiln,rfc:双倍;
actDilnE:扩展;
sActDiln1、sActDiln2、sActDiln3:字符串;
开始
t:=TDBISAMTable.Create(应用程序);
不要开始
表名:='xxx';
数据库名称:=“研究”;
活动:=假;
独占:=假;
如果存在,则删除表;
用fielddef开始
清楚的
添加('fld',ftString,10,False);
结束;
用indexdef开始
清楚的
结束;
创建表;

独占:=真// 内联浮点计算通常是扩展类型。检查中间变量也被扩展时的行为。

您使用的是什么数据库?
字段[itd]
列的实际声明类型是什么?对于
ndd
的任何值,我都无法使用双精度值或扩展值再现此问题。如果您能够提供SSCCE.DBISAM 4,我就可以回答此问题。我在最初的问题描述中添加了一些工作代码。也就是说,我认为尤金一针见血,尤金是对的。浮点数学和值是如此易变。如果您想了解更多详细信息,请查看这在C/C++中带来了多少“乐趣”。在一个20行程序中,您可以很容易地为我们提供一个没有任何DB代码的SSCCW。学会这样做对你会有很大的好处。