StrToFloat und FloatToStr liefern abweichendes Ergebnis



  • Hallo,

    AnsiString s = "123456789";
    float f = StrToFloat(s);
    ShowMessage(FloatToStr(f));
    //Ergebnis 123456792
    

    Kann mir bitte jemand erklären, warum es zu einem abweichendem Ergebnis kommt?

    Vielen Dank



  • Bitte Forumssuche zum Stichwort 'ungenau' benutzen.



  • Hallo

    Um die Suchrichtung vielleicht noch ein bißchen zu konkretisieren : Das ist kein Fehler des Builders, sondern eine Konsequenz aus dem Konzept der Fließkommazahlen. Es gibt drei Möglichkeiten :
    - Du verwendest Integer-Typen, da gibt es keine solchen Rundungesfehler. Dafür haben Builtin-Integer auch einen viel kleineren Wertebereich
    - Du verwendest double anstelle von float, das würde dein Beispiel erstmal korrigieren. Allerdings verschiebst du die Ungenauigkeit damit nur weiter, irgendwann ist auch double ungenau.
    - Wenn du wirklich quasi beliebig große exakte Zahlen brauchst, must du eine externe Library verwenden, die einen solchen Datentyp implementiert. Mit dem Stichwort "bigint" kannst du im Netz schon ein paar Ansätze finden.

    bis bald
    akari



  • Vielen Dank!

    Mit z.B. __int64 funktionieren auch größere (int)Zahlen, allerdings brauche ich noch die Nachkommazahlen.

    Danke nochmals



  • Hallo

    Du solltest den Hinweis von Jansen erst nehmen, und dich erstmal über die Eigenschaften und Einsatzbereiche von Integer-, Fließkomma- und Festkommatypen informieren. Denn eigentlich kennt der Computer gar keine Nachkommastehlen, und es gibt eben ein paar übliche Workarounds, um die Nachkommastellen für die Ausgabe zu simulieren.
    Wenn dir maximal 4 Nachkommastehlen reichen, kannst du den Builderspezifischen Datentyp Currency nehmen. Ansonsten selber schreiben oder im Netz nach einer entsprechenden Library suchen.

    bis bald
    akari



  • OK.
    Vielen Dank!



  • Hallo,

    Für diejenigen die es genau wissen wollen.
    http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html


Anmelden zum Antworten