这可以像预期的那样在我们的本地计算机上运行:
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
那是为什么?
答案 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都是相同的。