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


67

FmtBcd.pas已在Delphi XE2中进行了广泛的修订和重写。在我的一个项目中,我有一个案例,对两个Bcd值使用除法运算,但是两个版本产生不同的结果。在最坏的情况下,Delphi XE2可能会抛出Bcd overflow error

示例:在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个小数位。BcdMultiply对变量执行第二次操作C将导致Bcd overflow error

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

0.3333333333
0.11111111108888888889

任何人都可以提出解决该问题的最佳实践方法吗?


4
除了这是XE2中的错误外,很难说什么。
克林特·古德


1
为Win32或Win64编译时结果是否相同?
Francesca'2

1
@François:XE2中的Win32和Win64产生相同的结果。
洲慈阳

5
不好意思问,您在这里有什么问题?您只是在声明。如果提供的库有错误,则可以简单地重新实现所使用的函数。或使用工作版本中的版本。随你。
bidifx 2012年

Answers:


6

问题中的代码在XE2更新4中产生了预期的输出。请注意,更新3产生了错误的输出,因此很明显更新4附带了修复程序。此外,XE3产生了预期的输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.