67 votes

La fonction BcdDivide se comporte différemment dans Delphi XE et XE2

FmtBcd.pas a été largement révisée réécrit en Delphi XE2. Dans un de mes projets, j'ai un cas qui utilise une opération de division sur les deux Bcd valeurs, mais les deux versions de donner des résultats différents. Dans le pire des cas, le Delphi XE2 peut jeter un Bcd overflow error.

Exemple: en Exécutant le code suivant dans Delphi XE2 console apps:

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.

Sortie de la ci-dessus sera:

0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow

La variable C contient une Valeur Bcd avec 63 décimales de la spécificité. Effectuer un deuxième BcdMultiply de l'opération sur la variable C entraînera une Bcd overflow error.

Cependant, pour exécuter le même code en Delphi XE donne le résultat suivant sans aucune exception, l'invite suivante:

0.3333333333
0.11111111108888888889

Quelqu'un pourrait s'il vous plaît suggérer une bonne pratique de la méthode pour résoudre ce problème?

6voto

David Heffernan Points 292687

Le code de la question génère la sortie attendue dans la mise à jour 4 de XE2. Notez que la mise à jour 3 génère la sortie incorrecte et que, par conséquent, le correctif est arrivé avec la mise à jour 4. En outre, XE3 génère la sortie attendue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X