在单位Data.FmtBcd.pas
中,BcdPrecision
和BcdScale
函数定义为:
function BcdPrecision(const Bcd: TBcd): Word;
begin
Result := Bcd.Precision - BcdScale(Bcd);
end;
function BcdScale(const Bcd: TBcd): Word;
begin
Result := (Bcd.SignSpecialPlaces and 63);
end;
和TBcd
声明为:
TBcd = record
Precision: Byte; { 1..64 }
SignSpecialPlaces: Byte; { Sign:1, Special:1, Places:6 }
Fraction: packed array [0..31] of Byte; { BCD Nibbles, 00..99 per Byte, high Nibble 1st }
end;
执行以下代码会导致错误:
var
B, B1: TBcd;
i1, i2: integer;
begin
B := 530;
i1 := BCDPrecision(B); // return 3
i2 := BCDScale(B); // return 1
Assert(NormalizeBcd(B, B1, i1, i2));
end;
BCDPrecision(B)
返回3
(B.Precision - 1
),从而导致错误。
如果BCDPrecision(B)返回4
,那么它不会导致错误。为什么BCDPrecision
的实施会被BCDScale
扣除而不会返回TBcd.Precision
?