その理由は型変換だと思います。関数は結果をAbs()
返すため、変数は にキャストされます。ドキュメントを見てください:real
currency
real
通貨は、通貨計算の丸め誤差を最小限に抑える固定小数点データ型です。Win32 プラットフォームでは、下位 4 桁が暗黙的に小数点以下を表す、スケーリングされた 64 ビット整数として格納されます。割り当てや式で他の実数型と混合すると、Currency 値は自動的に 10000 で除算または乗算されます。
したがって、通貨は固定で、実数は浮動小数点です。あなたの質問のサンプルコードは次のとおりです。
program Project3;
{$APPTYPE CONSOLE}
const VALUE = 0.09;
var a,b : currency;
begin
a := VALUE;
b := VALUE;
if a = Abs(b) then writeln('equal')
else writeln('not equal', a - Abs(b));
readln;
end.
型変換のため、等しくない結果を生成します。
コンパイラ ウォッチは abs(vtemp1) と vtemp2 の同じ値を明らかにします
を追加してからx : real
を呼び出しx := abs(b);
、x
ウォッチ リストに追加し、それを選択して を押しEdit watch
、次に [浮動小数点] を選択します。X
になり0.899...967
ます。
価値だけ0.09
がそのような結果を生み出すわけではありません。このコードを試して確認できます:
for i := 0 to 10000 do begin
a := a + 0.001;
b := a;
if a <> abs(b) then writeln('not equal', a);
end;
したがって、通貨変数の絶対値が必要な場合は、それを実行してください。浮動小数点を使用しないでくださいabs()
:
function Abs(x : Currency):Currency; inline;
begin
if x > 0 then result := x
else result := -x;
end;