Announcement

Collapse
No announcement yet.

Falsche Berechnung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Falsche Berechnung

    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

  • #2
    Unglaublich - habe es selber mit Delphi 7 unter Windows Xp und mit Delphi XE unter Windows 7 ausprobiert und es kommen wirklich zwei unterschiedliche Ergebnisse heraus. Bin gespannt, ob jemand eine Erklärung dazu liefern kann.

    bye,
    Helmut

    [edit] habe das Problem jetzt mal in die newsgroup embarcadero.public.delphi.non-technical gestellt (Titel rounding with mysterious behavior) - weil's mich selber auch stark interessiert. Hoffe das ist okay, akleemann?
    Zuletzt editiert von hwoess; 01.04.2011, 18:35.

    Comment


    • #3
      Datentyp beachten

      Hey,
      verwendet man Currency anstatt Double, ist das Problem gelöst.

      Comment

      Working...
      X