先月、手数料の支払いに関する問題が発生しました。ドルの金額は、整数が保持できる実際の値を超えています。これは、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)));
金銭計算のバイナリ浮動小数点の使用は非常に悪いスタイルです。 – CodesInChaos
'10000 *'が存在すると、実際に 'AsDecimal'を実行すべきかどうか疑問になります。 –