在保留一些代码的同时,我发现了这句话:
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;
答案 0 :(得分:5)
内联浮点计算通常是扩展类型。检查中间变量也是扩展时的行为。