Penso che il motivo sia il tipo conversioni. La funzione Abs()
restituisce i risultati real
, quindi i valori variabili da currency
a real
. Date un'occhiata alla documentazione:
La valuta è un tipo di dati a virgola fissa che riduce al minimo gli errori di arrotondamento nei calcoli monetari . Sulla piattaforma Win32, è memorizzato come un intero a 64 bit in scala con le quattro ultime cifre significative implicitamente che rappresentano le posizioni decimali. Quando miscelato con altri tipi reali assegnazioni ed espressioni, valori di valuta vengono automaticamente divisi o moltiplicati per 10000.
quindi valuta è fisso e reale fluttua-point. Codice di esempio per la tua domanda è:
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.
produce non uguale risultato, a causa delle conversioni di tipo;
orologio compilatore rivela lo stesso valore per abs (vtemp1) e vtemp2
provare ad aggiungere x : real
, quindi chiamare x := abs(b);
, aggiungere x
agli orologi lista, selezionarlo e premere Edit watch
, quindi selezionare in virgola mobile . X
diventa 0.899...967
.
non solo il valore 0.09
produce tale risultato. puoi provare questo codice per verificare:
for i := 0 to 10000 do begin
a := a + 0.001;
b := a;
if a <> abs(b) then writeln('not equal', a);
end;
quindi, se hai bisogno del valore assoluto della variabile Valuta, fallo e basta. non utilizzare virgola mobile abs()
:
function Abs(x : Currency):Currency; inline;
begin
if x > 0 then result := x
else result := -x;
end;
non può riprodurre – kludg
[Quanto è pericoloso per confrontare i valori in virgola mobile?] (Http://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floating-point -valori) – valex
Usa 'SameValue' da 'math' o simile. –