我認爲原因是類型轉換。 Abs()
函數返回real
結果,所以currency
變量轉換爲real
。看看文檔:
貨幣是一種定點數據類型,可以最大限度地減少貨幣計算中的舍入錯誤。在Win32平臺上,它被存儲爲縮放的 64位整數,最後四位有效數字隱含地代表小數位數 。當在 分配和表達與其他真實類型混合,貨幣值被自動分割 或乘以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;
無法重現 – kludg 2012-08-13 07:12:37
[比較浮點值有多危險?](http://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floatingpoint -values) – valex 2012-08-13 07:47:50
使用'數學'或類似的'SameValue'。 – 2012-08-13 07:55:53