Announcement

Collapse
No announcement yet.

Suche eine allgemein funktionierende Rundungsfunktion

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

  • #31
    Hallo Patrick,

    für die Speicherung von Fließkommazahlen gibt es einen internationalen Standard IEEE 754. Borland hält sich dran.

    Mit Fließkommazahlen kann man nun mal nicht jede Zahl exakt darstellen. Wieviele Zahlen im Einzelnen nicht exakt dargestellt werden können hängt von der Größe des Datentyps ab. Der Datentyp Extended kann halt "zufällig" die Zahl 0.015 exakt darstellen. Es gibt aber genügend Zahlen innerhalb des Wertebereiches die eben nicht exakt dargestellt werden können.

    Je nach Einsatzzweck muß man halt den passenden Datentyp wählen. Für ein 100% exaktes Rechnen sind Fließkommazahlen nicht geeignet. Festpunktzahlen eignen sich dazu viel besser (z.B. currency).

    Zu Interbase nur soviel http://www.dibug.de/newsletter/2002_02b.txt.

    Tschau

    Torste

    Comment


    • #32
      Betreff Java:
      http://www.entwickler-forum.de\WebX?14@@.1dd0445e/0

      mfg
      P

      Comment


      • #33
        Hallo,
        <br>
        <br>ich vergaß ganz "Danke Torsten".
        <br>
        <br>PHP ist auch anfällig für dieses Phänomen siehe:
        <br>http://www.entwickler-forum.de\WebX?14@@.2cb7cdde/0
        <br>
        <br>Und somit ist es wohl war (sozusagen empirisch widerlegt ;-) )
        <br>>Es gibt aber genügend Zahlen innerhalb des Wertebereiches die eben nicht exakt dargestellt werden können.
        <br>
        <br>mfg
        <br>P

        Comment


        • #34
          Hallo Patrick,

          ich freue mich über jedes Dankeschön, unabhängig davon das dieses Posting fast ein Jahr zurückliegt.

          Schönes Wochenende

          Torste

          Comment


          • #35
            <I>Der Datentyp Extended kann halt "zufällig" die Zahl 0.015 exakt darstellen.</I>

            Falsch. 0.015 kann grundsätzlich nicht als endlicher Binärbruch dargestellt werden.

            Das gilt für die Mehrheit der endlichen Dezimalbrüche: Wann immer nach Primfaktorzerlegung (und Kürzen) im Nenner mindestens eine Fünf stehen bleibt. Im Beispiel:

            0.015
            = 15/1000
            = (3*5)/(2*5)³
            = 3/(2³*5²)

            Das ist übrigens der Geburtsfehler von Funktionen wie [Simple]RoundTo (Unit Math, IIRC seit D6):

            ShowMessage(FloatToStr(SimpleRoundTo(0.015, -2)));

            Gruß, Rober

            Comment


            • #36
              Hi,

              probier mal folgende routine
              <pre>
              FUNCTION roundme(wert:double;nk:integer):double;
              const
              cBase : integer = 10;
              var
              i,nkp : Integer;
              mupi : Cardinal;

              begin
              mupi := 10;
              for i := 1 to nk do
              mupi := mupi * cBase;
              result := frac((wert*mupi)+5.0) / Mupi;
              end;
              </pre>

              sie sollte funktionieren. Das Problem liegt in der art und weiße wie die FPU rundet und existiert auch schon seit DOS-Zeiten

              Gruß

              Uw

              Comment


              • #37
                Versuche damit mal -0.75 zu runden

                Comment

                Working...
                X