Delphi XE和XE2中的BcdDivide函数行为不同

67

FmtBcd.pas在Delphi XE2中进行了大量修订和重写。在我的一个项目中,我有一个使用除法运算的情况,它作用于两个Bcd值,但这两个版本产生不同的结果。在最坏的情况下,Delphi XE2可能会引发Bcd溢出错误

示例:在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包含一个具有63位小数精度的BCD值。在变量C上执行第二个BcdMultiply操作将导致Bcd溢出错误

然而,在Delphi XE中运行相同的代码会得到以下结果,而不会出现任何异常提示:

0.3333333333
0.11111111108888888889

请问有什么最佳实践方法可以解决这个问题吗?


4
除了这是XE2中的一个 bug 之外,很难说出其他任何东西。 - Clint Good
8
我已经向http://qc.embarcadero.com/wc/qcmain.aspx?d=103106报告了。 - Chau Chee Yang
1
编译为Win32或Win64时结果相同吗? - Francesca
1
http://qc.embarcadero.com/wc/qcmain.aspx?d=103106 在10月19日仍然是Open状态。已经7个月了,还在检查中... - NilsB
6
抱歉打扰,您在这里的问题是什么?您只是陈述了一些内容。如果提供的库存在缺陷,您可以简单地重新实现所使用的函数或使用正常运行版本的函数。随意选择。 - bidifx
显示剩余2条评论
1个回答

6

问题中的代码在XE2更新4中产生了预期的输出。请注意,更新3会产生错误的输出,因此显然修复程序是在更新4中提供的。另外,XE3也能产生预期的输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接