Announcement

Collapse
No announcement yet.

Fehler bei String zu Float -Umwandlung

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

  • Fehler bei String zu Float -Umwandlung

    Hi,
    bei mir gibt es immer Probleme beim Umwandeln von Strings in Float mit Hilfe von StrToFloat(...); Grob stimmt die Zahl immer, aber auch wenn ich z.B. "0,09" umwandle kommt als float 0,0900000035762787 heraus! Woran kann das liegen? Was muss man beachten, das ich nicht beachte?
    Vielen Dank!
    MfG Jacob2
    MfG Jacob2

    Meine Website mit Roboter-, Elektronik- und Softwareprojekten: www.roboterbastler.lima-city.de

  • #2
    Bei kommt bei

    String text="0,09";
    float x=StrToFloat(text);

    korrekt 0.09 im float an
    Christian

    Comment


    • #3
      Was muss man beachten, das ich nicht beachte?
      Float werden im Computer binär dargestellt und die Darstellung ist nach Norm IEC 60559:1989 (IEEE 754) standardisiert.

      Dabei gilt zu beachten dass die Genauigkeit bei Float 7 Stellen beträgt. Somit ist dein Ergebnis korrekt, denn alles was nach 7 Stellen (notabene in wissenschaftlicher Darstellung der Zahl) ist wird von Float nicht berücksichtigt.

      Für höhere Genauigkeit zB Double verwenden.

      Anmerkung: Aus diesem Grund solllte ein Vergleich von zwei Float-Werten nicht mit Float1 = Float2 erfolgen sondern mit Abs(Float1 - Float2) < Genauigkeit.

      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4


        Nun, dann müssen wir nur noch klären, warum ich einen korrekten Wert im float habe, und er offenbar nicht
        Zuletzt editiert von Christian Marquardt; 01.03.2009, 11:03.
        Christian

        Comment


        • #5
          Ich hab ja nicht an deinem Ergebnis gezweifelt

          Warum das so ist weiß ich nicht genau, aber ich denke das hat mit der "Intelligenz" der IDE zu tun. Denn es werden definitiv nicht nur "0,09" gespeichert sonder dern Wert in der 32bit-Darstellung -> da kann es zu diesen unscharfen Werten kommen.

          Eventuell wird bei dir auch das "unscharfe" Ergebnis angezeigt wenn du den Float-Wert in der Konsole mit 10 Nachkommastellen ausgibts.

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Denke eher es ist ein "Formulierungsfehler".... in seinem float wird auch schon das Richtige landen.

            Dann wird er sich das Ergebnis mit

            String text=FloatToStr(x);

            wieder rückwandeln. Und das erst führt -aus den von dir geschilderten Gründen- zu der "langen" Ausgabe
            Christian

            Comment


            • #7
              Also, diese lange Zahl kommt bei folgendem Code:
              Code:
              void __fastcall TForm1::FormClick(TObject *Sender)
              {
                float zahl;
                zahl = StrToFloat(Edit1->Text);
                Label1->Caption = FloatToStr(zahl);
              }
              Ist irgendwas an dem Code nicht richtig?
              MfG Jacob2

              Meine Website mit Roboter-, Elektronik- und Softwareprojekten: www.roboterbastler.lima-city.de

              Comment


              • #8
                Ach, helfen kann die Umwandlung in ein double und ein Runden:

                double t=round(x,2);

                http://www.marquardtnet.info/cecke/q...quicky_03.html
                Christian

                Comment


                • #9
                  QED

                  float zahl;
                  zahl = StrToFloat(Edit1->Text);
                  double test=round(zahl,2);
                  Label1->Caption = FloatToStr(test);
                  Christian

                  Comment


                  • #10
                    Denke eher es ist ein "Formulierungsfehler"
                    Ist auch möglich.

                    Um es genau sagen zu können müsste die Funktion zur Umwandlung von String zu Float und umgekehrt geprüft werden. Da wird sich irgendwo ein Fehler aufgrund der vielen Addition, die bei der Umwandlung verwendet werden, einschleichen.

                    Das ist aber nicht von Relevanz da die Stellen im Genauigkeitsbereich stimmen und das ist die Hauptsache.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Wo ist denn round(double,int) definiert? Bei mir klappts nach #include <math.h> nicht!

                      Ist das beim BCB V. 1 etwa noch nicht dabei?
                      Zuletzt editiert von Christian Marquardt; 30.11.2008, 12:28.
                      MfG Jacob2

                      Meine Website mit Roboter-, Elektronik- und Softwareprojekten: www.roboterbastler.lima-city.de

                      Comment


                      • #12
                        Du musst die von der Seite den Quellcode kopieren und dann je nachdem wo du die Funktion brauchst diese deklarieren -> also in der entsprechenden *.h Datei

                        Ist das beim BCB V. 1 etwa noch nicht dabei?
                        Nein
                        Christian

                        Comment


                        • #13
                          Schade! Gibts also noch eine andere Lösung?
                          MfG Jacob2

                          Meine Website mit Roboter-, Elektronik- und Softwareprojekten: www.roboterbastler.lima-city.de

                          Comment


                          • #14
                            Schade! Gibts also noch eine andere Lösung?

                            ???

                            Warum ist es dir nicht möglich

                            1. obigen Link anzuklicken -> Beitrag 8
                            2. den Quellcode zu kopieren
                            3. in deine Headerdatei eine Deklaration einzubauen
                            Fertig, dieser Code funktioniert dann und eine andere Lösung ist nicht erforderlich
                            float zahl;
                            zahl = StrToFloat(Edit1->Text);
                            double test=round(zahl,2);
                            Label1->Caption = FloatToStr(test);
                            ????
                            Ist mir unverständlich
                            Christian

                            Comment


                            • #15
                              Ach, da hab ich was falsch verstanden! Mit dem Code gehts dann!
                              Wie ich sehe, scheint es dem Compiler nichts auszumachen, wenn ich der Funktion statt double float übergebe! double ist meines Wissens genauer als float, besteht double sozusagen aus mehreren float's und man kann sie deshalb ersetzen?
                              MfG Jacob2

                              Meine Website mit Roboter-, Elektronik- und Softwareprojekten: www.roboterbastler.lima-city.de

                              Comment

                              Working...
                              X