FmtBcd.pas
был значительно переработан и переписан в Delphi XE2. В одном из моих проектов у меня есть случай, в котором используется операция деления двух значений Bcd
, но две версии дают разные результаты. В худшем случае Delphi XE2 может выдать ошибку переполнения Bcd
.
Пример: выполнение следующего кода в консольных приложениях Delphi XE2:
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.
Результатом выше будет:
0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow
Переменная C
содержит значение Bcd с 63 десятичными знаками специфичности. Выполнение второй операции BcdMultiply
над переменной C
вызовет ошибку переполнения Bcd
.
Однако выполнение того же кода в Delphi XE дает следующий результат без каких-либо запросов об исключении:
0.3333333333
0.11111111108888888889
Может ли кто-нибудь предложить лучший метод решения этой проблемы?