在维护一些代码时,我遇到了这个语句:
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/