【问题标题】:BcdDivide function behave differently in Delphi XE and XE2BcdDivide 函数在 Delphi XE 和 XE2 中的行为不同
【发布时间】:2012-02-25 17:11:42
【问题描述】:

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 包含一个具有 63 位小数的 Bcd 值。对变量C 执行第二次BcdMultiply 操作将导致Bcd overflow error

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

0.3333333333
0.11111111108888888889

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

【问题讨论】:

  • 除了这是 XE2 中的一个错误之外,很难说别的。
  • 为 Win32 或 Win64 编译时结果相同?
  • @François: XE2 中的 Win32 和 Win64 产生相同的结果。
  • 很抱歉,您的问题是什么?你只是在发表声明。如果提供的库有问题,那么您可以简单地重新实现使用过的函数。或者使用工作版本中的那些。随便。

标签: delphi delphi-xe delphi-xe2


【解决方案1】:

问题中的代码在 XE2 更新 4 中产生了预期的输出。请注意,更新 3 会产生错误的输出,因此很明显,修复是随着更新 4 到达的。此外,XE3 会产生预期的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 2013-01-11
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多