2011-11-28 1 views
2

先月、手数料の支払いに関する問題が発生しました。ドルの金額は、整数が保持できる実際の値を超えています。これは、Appが書かれて以来初めて起こったことです。Int64と負数の丸めに関する問題は何ですか?ここには何がありますか?

clist   : tstringlist; 

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

金額は、我々は10000で乗算し、整数の最大は

2147483647だから我々はint64型の整数を高めている2159807200.の答えを得る$ 215,980.72でした。

clist.objects[dex]:= tobject(round((10000*DM.QryComm1.fieldbyname('COSS_NET_CHECK_AMT').asfloat)) + int64(clist.objects[dex])) 

私たちが抱えている問題は、負の整数が伝わってくる、我々はint64型を使用している場合は、4294428496のデフォルト値が実際の値をtstringlsitに入れ、されていない場合です。これはネガでのみ発生します。正の数は問題ありません。

私たちはウェブ全体を調査しており、解決策を見つけることができません。

ここでは明らかに情報が失わ32ビットポインタに64ビット整数をキャストしているよう

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

が見える.....元のコードです。あなたのコードは基本的にはそうですInt64(UInt32(some64BitInteger))

回避策として、フィールドにInt64を含む新しいオブジェクトを作成することができます。しかしもちろん、あなたはそれを破壊する世話をする必要があります。そうしないと、メモリがリークします。

きれいな解決策は、文字列 - > Int64辞書ですが、最近のバージョンのデルファイでのみ利用可能です。

+0

+1はオブジェクトポインタが32ビットのみであることを完全に忘れていました。本質的には、私の答えは間違っていませんでしたが、あなたの爪がちょうど良いヒットしました:) –

関連する問題