上个月,我们遇到佣金支付问题。美元金额超过了整数可以容纳的实际值。这是自应用程序编写以来第一次发生。
clist : tstringlist;
clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + integer(clist.objects[dex]));
美元金额为215,980.72美元,我们乘以10000并获得2159807200的答案。整数的最大值为2147483647.
所以我们将整数增加到int64。
clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + int64(clist.objects[dex]))
我们遇到的问题是,如果我们使用int64时出现负整数,则在tstringlsit中放置默认值4294428496,而不是实际值。这只发生在负片上。正数很好。
我们一直在网上进行研究,但无法找到解决方案。
这是原始代码.....
while not DM.QryComm1.eof do
begin
.
.
{Sum net amount for each BVCICI_ID}
dex:=clist.indexof(BVCICI_ID);
if dex<> -1 then
clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) +
integer(clist.objects[dex]))
else
clist.addobject(BVCICI_ID, tobject( round(DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat*10000)));
答案 0 :(得分:8)
看起来你正在向64位指针投射64位整数,这显然会丢失信息。您的代码似乎基本上是Int64(UInt32(some64BitInteger))
作为一种解决方法,您可以创建一个包含Int64
字段的新对象。但是当然你需要注意摧毁它,否则你会泄漏记忆。
一个干净的解决方案是string-&gt; Int64字典,但这些只在最近的delphi版本中可用。