2014-02-20 49 views
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; 
+0

您使用的數據庫是?什麼是Fields [itd]列的實際聲明類型?對於任何「ndd」值,我無法使用Double或Extended值重現此問題。 –

+0

如果只能提供SSCCE,我可以回答這個問題。 –

+0

DBISAM 4.我在原始問題描述中添加了一些工作代碼。也就是說,我相信尤金碰到了頭部。 –

回答

5

內聯浮點運算通常是擴展型的。檢查中間變量擴展時的行爲。