2012-02-03 184 views
66

FmtBcd.pas已經在Delphi XE2中進行了大量修改。在我的一個項目中,我有一個案例使用兩個Bcd值的除法操作,但這兩個版本產生不同的結果。在最壞的情況下,Delphi XE2可能會拋出一個Bcd overflow error在Delphi XE和XE2中BcdDivide函數的行爲有所不同

示例:運行在Delphi XE2控制檯應用程序以下代碼:

var A, B, C, D: TBcd; 
begin 
    A := StrToBcd('1'); 
    B := StrToBcd('3'); 
    BcdDivide(A, B, C); 
    WriteLn(BcdToStr(C)); 

    try 
    BcdMultiply(C, C, D); 
    WriteLn(BcdToStr(D)); 
    except 
    on E: Exception do 
     WriteLn(E.Message); 
    end; 

    ReadLn; 
end. 

的輸出將是:

0.333333333333333333333333333333333333333333333333333333333333333 
BCD overflow 

可變C包含一個BCD值具有特異性的63位小數。對變量C執行第二個BcdMultiply操作將導致Bcd overflow error

然而,運行在Delphi XE相同的代碼產生以下結果沒有任何異常提示:

0.3333333333 
0.11111111108888888889 

任何人都可以請建議解決這個問題的最佳實踐方法是什麼?

+4

很難說除了這是XE2中的一個錯誤之外的其他任何東西。 – 2012-02-03 02:05:33

+8

我已經報告給http://qc.embarcadero.com/wc/qcmain.aspx?d=103106 – 2012-02-03 02:10:39

+1

編譯爲Win32或Win64時的結果相同嗎? – 2012-02-03 02:38:06

回答

5

在問題的代碼產生在XE2更新4.注意預期的輸出更新3產生不良輸出等明確的修復帶着更新4.此外,XE3產生預期的輸出。