在不同的Delphi安装上,从双精度转换为货币的不同行为

时间:2019-04-18 17:08:20

标签: delphi

这可以像预期的那样在我们的本地计算机上运行:

var
  c : Currency;
  f : Double;
begin
  f := 0.12345;
  c := Currency(f);
  OutputDebugString(PChar(FloatToStrF(c, ffNumber, 18, 4)));
end;
Debug Output: 0,1235

在我们的CI机器上,我们得到:

Debug Output: 459.355.993.064.714,7130

那是为什么?

1 个答案:

答案 0 :(得分:2)

我们注意到Delphi Berlin和Tokyo之间似乎没有记录在案的行为变化,后者在我们的计算机上运行,​​而前者在CI服务器上运行。从双精度转换为货币的显式行为在柏林之前的版本中表现得并不理想:

MyFormU.pas.43: f  := 0.12345;
005CE74D C745D07CF2B050   mov [ebp-$30],$50b0f27c
005CE754 C745D46B9ABF3F   mov [ebp-$2c],$3fbf9a6b
MyFormU.pas.44: c  := Currency(f);
005CE75B 8B45D0           mov eax,[ebp-$30]
005CE75E 8945E0           mov [ebp-$20],eax
005CE761 8B45D4           mov eax,[ebp-$2c]
005CE764 8945E4           mov [ebp-$1c],eax
MyFormU.pas.45: c2 := f;
005CE767 DD45D0           fld qword ptr [ebp-$30]
005CE76A D80D80E85C00     fmul dword ptr [$005ce880]
005CE770 DF7DD8           fistp qword ptr [ebp-$28]
005CE773 9B               wait 

请注意,隐式强制转换会进行适当的fp乘法,以将双精度转换为Int64(货币存储为Int64),而显式强制转换则不会。

从东京开始,两个演员的生成的asm都是相同的。