FmtBcd.pas
è stata ampiamente revisionata riscritta in Delphi XE2. In uno dei miei progetti, ho un caso che utilizza un'operazione di divisione su due valori Bcd
, ma le due versioni danno risultati diversi. Nel peggiore dei casi, il Delphi XE2 potrebbe lanciare un Bcd overflow error
.La funzione BcdDivide si comporta in modo diverso in Delphi XE e XE2
Esempio: L'esecuzione del seguente codice in Delphi XE2 applicazioni console:
var A, B, C, D: TBcd;
begin
A := StrToBcd('1');
B := StrToBcd('3');
BcdDivide(A, B, C);
WriteLn(BcdToStr(C));
try
BcdMultiply(C, C, D);
WriteLn(BcdToStr(D));
except
on E: Exception do
WriteLn(E.Message);
end;
ReadLn;
end.
uscita di quanto sopra sarà:
0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow
La variabile C
contiene un valore BCD con 63 cifre decimali di specificità . L'esecuzione di una seconda operazione BcdMultiply
sulla variabile C
causerà un Bcd overflow error
.
Tuttavia, per eseguire lo stesso codice in Delphi XE produce il seguente risultato senza alcun prompt di eccezione:
0.3333333333
0.11111111108888888889
Qualcuno potrebbe suggerire un metodo best-practice per risolvere questo problema?
Difficile dire altro, tranne che si tratta di un bug in XE2. –
Ho segnalato a http://qc.embarcadero.com/wc/qcmain.aspx?d=103106 –
Stessi risultati quando compilato per Win32 o Win64? –