2
同時維持一定的代碼,我碰到這個聲明是代碼,如下所示:使用的臨時變量的變化格式化輸出
actDiln := Fields[itd].AsFloat * rfc/100;
sActDiln := Format('%.*f',[tdDigits.ndd, actDiln]);
當 「字段[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;
您使用的數據庫是?什麼是Fields [itd]列的實際聲明類型?對於任何「ndd」值,我無法使用Double或Extended值重現此問題。 –
如果只能提供SSCCE,我可以回答這個問題。 –
DBISAM 4.我在原始問題描述中添加了一些工作代碼。也就是說,我相信尤金碰到了頭部。 –