2011-11-28 33 views
2

上個月我們遇到了佣金支付方面的問題。美元金額超過了整數可以容納的實際值。這是自應用程序寫入以來第一次發生。問題四捨五入Int64和負數,我在這裏失蹤了什麼?

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,的4294428496缺省值被放置在tstringlsit而不是實際的數值。這隻發生在負面情況下。正數很好。

我們一直在研究所有的網絡,並找不到解決方案。

這裏是原來的代碼.....

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

在貨幣計算中使用二進制浮點是非常糟糕的風格。 – CodesInChaos

+1

'10000 *'的存在讓人懷疑你是否應該真正做'AsDecimal'。 –

回答

8

看起來像你強制轉換爲32位指針,這顯然失去了信息的64位整數。看起來您的代碼基本上是Int64(UInt32(some64BitInteger))

作爲解決方法,您可以創建一個包含Int64 as字段的新對象。但是當然你需要注意摧毀它,否則你會泄漏內存。

一個乾淨的解決方案將是一個字符串 - > Int64字典,但只有在最近版本的delphi中才有。

+0

+1完全忘記了只有32位的對象指針。實質上,我的回答沒有錯,但你的指甲更好:) –