上個月我們遇到了佣金支付方面的問題。美元金額超過了整數可以容納的實際值。這是自應用程序寫入以來第一次發生。問題四捨五入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)));
在貨幣計算中使用二進制浮點是非常糟糕的風格。 – CodesInChaos
'10000 *'的存在讓人懷疑你是否應該真正做'AsDecimal'。 –