2012-02-03 179 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产生预期的输出。