Ich habe hier ein eigenartiges Phänomen, daß bei zusammengesetzten berechnungen ein anderer Wert erzuegt wird, als bei einer Aufteilung einer Berechnung - siehe folgendes Programm:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
function CheckRound1(const dbl: double): double;
begin
Result := dbl * 100;
if dbl >= 0 then
Result := Result + 0.5
else
Result := Result - 0.5;
Result := System.Trunc(Result) / 100;
end;
function CheckRound2(const dbl: double): double;
begin
if dbl >= 0 then
Result := System.Trunc((dbl * 100) + 0.5) / 100
else
Result := System.Trunc((dbl * 100) - 0.5) / 100
end;
var dbl: double;
begin
// we want to round this to correct 2 decimal after the decimal point
// the expected result should be 218.92
dbl := 218.915;
// here is the expected result
WriteLn(FloatToStrF(CheckRound1(dbl), ffNumber, 15, 2));
// wrong result 218.91 ??!!
dbl := 218.915;
WriteLn(FloatToStrF(CheckRound2(dbl), ffNumber, 15, 2));
end.
Bei CheckRound1 ist die Berechnung in einzelne Schritte geteilt und das erwartete Ergebnis wird auch zurückgeleiegert, wohingegen in CheckRound2 alles in einem Schritt berechnet wird, und ein falsches Ergebnis (meines Erachtens nach) zurückgeliefrt wird. Eigentlich gehe ich davon aus, daß beide Funktionen genau daselbe machen, und auch dementsprechend dieselben Werte berechnen und zurückliefern, oder liege ich einem Irrtum aui?
Was stimmt hier nicht
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
function CheckRound1(const dbl: double): double;
begin
Result := dbl * 100;
if dbl >= 0 then
Result := Result + 0.5
else
Result := Result - 0.5;
Result := System.Trunc(Result) / 100;
end;
function CheckRound2(const dbl: double): double;
begin
if dbl >= 0 then
Result := System.Trunc((dbl * 100) + 0.5) / 100
else
Result := System.Trunc((dbl * 100) - 0.5) / 100
end;
var dbl: double;
begin
// we want to round this to correct 2 decimal after the decimal point
// the expected result should be 218.92
dbl := 218.915;
// here is the expected result
WriteLn(FloatToStrF(CheckRound1(dbl), ffNumber, 15, 2));
// wrong result 218.91 ??!!
dbl := 218.915;
WriteLn(FloatToStrF(CheckRound2(dbl), ffNumber, 15, 2));
end.
Bei CheckRound1 ist die Berechnung in einzelne Schritte geteilt und das erwartete Ergebnis wird auch zurückgeleiegert, wohingegen in CheckRound2 alles in einem Schritt berechnet wird, und ein falsches Ergebnis (meines Erachtens nach) zurückgeliefrt wird. Eigentlich gehe ich davon aus, daß beide Funktionen genau daselbe machen, und auch dementsprechend dieselben Werte berechnen und zurückliefern, oder liege ich einem Irrtum aui?
Was stimmt hier nicht
Comment