围绕Int64和负数的问题,我在这里缺少什么?

Sha*_*ane 2 delphi delphi-7

上个月,我们遇到佣金支付问题.美元金额超过了整数可以容纳的实际值.这是自应用程序编写以来第一次发生这种情况.

clist           : tstringlist; 

clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + integer(clist.objects[dex]));
Run Code Online (Sandbox Code Playgroud)

美元金额为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]))
Run Code Online (Sandbox Code Playgroud)

我们遇到的问题是如果我们使用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)));
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 8

看起来你正在将64位整数转换为32位指针,这显然会丢失信息.看起来你的代码基本上就是这样Int64(UInt32(some64BitInteger))

作为解决方法,您可以创建包含Int64as字段的新对象.但是当然你需要照顾它来摧毁它,否则你会泄漏记忆.

一个干净的解决方案是string-> Int64字典,但这些只在最新版本的delphi中可用.