Delphi 四舍五入Int64和负数的问题,我在这里遗漏了什么?

Delphi 四舍五入Int64和负数的问题,我在这里遗漏了什么?,delphi,delphi-7,Delphi,Delphi 7,上个月我们在支付佣金方面遇到了问题。美元金额超过了整数可以容纳的实际值。这是自应用程序编写以来首次发生这种情况 clist : tstringlist; clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + integer(clist.objects[dex])); 美元的金额是215980.72美元,我们乘以10000,得

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

clist           : tstringlist; 

clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + integer(clist.objects[dex]));
美元的金额是215980.72美元,我们乘以10000,得到的结果是2159807200美元。整数的最大值为2147483647

因此,我们将整数增加到int64

clist.objects[dex]:= tobject( round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + int64(clist.objects[dex]))
我们遇到的问题是,如果在使用int64时出现了一个负整数,则TstringList中会出现一个默认值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)));
而不是DM.QryComm1.eof do
开始
. 
. 
{每个BVCICI_ID的总净额}
索引:=clist.indexof(BVCICI_ID);
如果dex-1那么
clist.objects[dex]:=tobject(round((10000*DM.QryComm1.fieldbyname('COSS\u NET\u CHECK\u AMT').asfloat))+
整数(clist.objects[dex]))
其他的
clist.addobject(bvcicici_ID,tobject(round(DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat*10000));

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

作为一种解决方法,您可以创建一个包含
Int64
As字段的新对象。但是你当然需要注意破坏它,否则你会泄漏内存


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

您在货币计算中使用二进制浮点的风格非常糟糕。
10000*
的出现让人怀疑您是否真的应该使用
AsDecimal
+1完全忘记了对象指针只有32位。从本质上说,我的回答没有错,但你的回答更准确:)