Announcement

Collapse
No announcement yet.

String in float wandeln

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

  • String in float wandeln

    Hallo,

    Ich habe einen String der eine Zahl in Exponentieller Schreibweise enthält:

    zahl=-2.710274E-06

    Wie kann ich das am schnellsten in eine float Zahl umwandeln?

    Danke!

  • #2
    Am schnellsten mit Convert.ToSingle(s), am sichersten mit Single.TryParse(s, out f);

    Jürgen

    Comment


    • #3
      Wobei auf die Kultur aufzupassen ist - sonst wird das Komma (hier der Punkt .) nicht richtig erkannt und das Ergebnis ist um 10e3 falsch!

      [highlight=c#]
      string s = "-2.710274E-06";
      float f1 = Convert.ToSingle(s, System.Globalization.CultureInfo.InvariantCulture) ;
      float f2 = float.Parse(s, System.Globalization.NumberFormatInfo.InvariantInf o);
      float f3;
      float.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInf o, out f3);
      [/highlight]
      Wobei Convert.ToSingle und float.Parse im wesentlichen ident sind (Convert überprüft nur das Argument nochmals).

      Am schnellsten mit Convert.ToSingle(s),
      Wenn du am schnellsten in Bezug auf die Laufzeit nimmst dann glaube ich mich erinnern zu können dass ich das mal getestet habe und da ist TryParse schneller gewesen.


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

      Comment


      • #4
        @Gü
        Nein, ich meinte "am schnellsten beim Schreiben". Aber ich bin sowieso ein Fan von TryParse, das auch am meisten Überladungen mit CultureInfo und auch eigenen Zahlenformaten hat.

        Jürgen

        Comment


        • #5
          Danke für eure Antworten.

          Ich nehme jetzt tryparse.Damit erreiche ich das gewünschte Ergebnis.

          Zu erst hatte ich convert.ToSingle ohne die CultureInfo Angabe genommen, da wurde dann E-06 ignoriert und es kam nur die Zahl heraus.

          VG

          Comment


          • #6
            Es ist jetzt doch später ein Problem aufgetreten.

            Es werden bei:
            float f3;
            float.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInf o, out f3);
            die Nullen abgeschnitten. Wie kann ich das verhindern bzw. wieder auffüllen?

            Bsp. 0.00063000 wird 0.00063
            Zuletzt editiert von gfoidl; 20.08.2009, 14:03. Reason: Zitat korrigiert

            Comment


            • #7
              Gar nicht. Rein mathematisch sind beide Werte identisch. Das, was du willst, ist nur eine String-Darstellung der Zahl, und die wird durch passende Parameter bei ToString gesteuert.

              Jürgen

              Comment


              • #8
                Die Nullen werden nicht abgeschnitten. Die Gleitkommazahl wird im Speicher mit 32 bit dargestellt und dabei kann es höchstens zu Rundungsfehlern kommen wenn die Repräsentation der Zahl Stellen abschneidet (zB bei Periodizität).

                Edit: Jürgen war schneller.

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

                Comment


                • #9
                  Das Problem was bei mir später auftritt ist folgendes:

                  Code:
                              float f1 = -0.0063000F;
                              float f2 = -0.0063F;
                  
                              float f3 = -0.007000F;
                  
                              if (f1 < f3)
                              {
                                  listBox1.Items.Add("-0.0063000F < -0.007F true");
                              }
                              else
                              {
                                  listBox1.Items.Add("-0.0063000F < -0.007F false");  //X
                              }
                  
                              if (f2 < f3)
                              {
                                  listBox1.Items.Add("-0.0063F < -0.007F true");  //X
                              }
                              else
                              {
                                  listBox1.Items.Add("-0.0063F < -0.007F false");
                              }
                  Die markierten Zeilen sind die unterschiedlichen Ergebnisse bei gleichem Zahlenwert.
                  Zuletzt editiert von snowy; 20.08.2009, 14:28.

                  Comment


                  • #10
                    Die Ausführung springt doch jedesmal in den else-Zweig - und das korrekt.
                    Nur das String-Literal das zur Listbox hinzugefügt werden soll ist falsch. Beim 2. else sollte auch false stehen (siehe Edit).


                    Edit: Das false wurde korrigiert während ich die Antwort schrieb.



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

                    Comment


                    • #11
                      Ja Entschuldigung.

                      Der Fehler sitzt vor dem Bildschirm :-)

                      Comment

                      Working...
                      X