Gast: MySQL - Unterschied decimal und float

Hallo,

ich habe für geografische Koordinaten das Format float (12,8) gewählt.

Nun stört mich aber, dass hinter dem Komma mit Nullen aufgefüllt wird. Das sieht wie ein korrekter Wert aus, aber in Wirklichkeit sind oft nur drei Nachkommastellen bekannt.

Kann ich das Feld von bestehenden Tabellen einfach in float umdefinieren? Oder passiert da was Unerwartetes mit den vorhandenen Werten?

Bei MySQL habe ich keinen Hinweis über den Wertebereich von floats gefunden.

Gast

  1. ich habe für geografische Koordinaten das Format float (12,8) gewählt.

    Korrektur:
    decimal (12,8)

    1. Tach!

      ich habe für geografische Koordinaten das Format float (12,8) gewählt.
      Korrektur:
      decimal (12,8)

      Das ändert einiges. Die 12 is ja nicht nur eine Längenangabe in Ziffern und damit auch eine Bereichseinschränkung sondern auch eine Angabe zur Präzision. Float hat nur 7 bis 8 Stellen, dafür aber einen wesentlich höheren Wertebereich, also du mit dem 12er Decimal erreichen kannst. Du müsstest auf Double (15-17 signifikante Stellen) umsteigen, wenn du solche eine hohe Präzision benötigst.

      Ansonsten gibt es mathematisch keinen Unterschied zwischen 5,300000 und 5,3 oder auch 000005,3. Die Genauigkeit der Zahlen bleibt dabei immer gleich. Du kannst also auch vor der Anzeige mit trim() die Nullen einfach abschneiden lassen.

      dedlfix.

      1. n'Abend,

        Ansonsten gibt es mathematisch keinen Unterschied zwischen 5,300000 und 5,3 oder auch 000005,3. Die Genauigkeit der Zahlen bleibt dabei immer gleich. Du kannst also auch vor der Anzeige mit trim() die Nullen einfach abschneiden lassen.

        Doch, es gibt Unterschiede. Der Wert 5,3 kann ein gerundeter Wert sein mit einer Ungenauigkeit (Meßfehler) von 5,25 bis 5,35.

        Am Äquator entspricht 1 Grad (Länge oder Breite) 111,111.. km, da kann man bei einer Wackeligen Zehntelstelle das Rollfeld oder den Hafen schon nmal um 11,111.. km verfehlen.

        Ich strebe eine Genauigkeit von 10 m an, also brauche ich fünf Nachkommastellen. Wenn die dann zufällig 5,30000 heißen, ist's ja in Ordnung.

        Gast

        1. Ich strebe eine Genauigkeit von 10 m an, also brauche ich fünf Nachkommastellen. Wenn die dann zufällig 5,30000 heißen, ist's ja in Ordnung.

          Ich glaube, ich habe mir die Erklärung gerade selbst gegeben. Ich kann weder decimal nutzen noch float.

          Bei beiden kann man die ursprünglich eingegebene Genauigkeit nicht mehr wiederherstellen, wenn die Nachkommastellen mit Nullen enden.

          Das heißt, bei decimal kann ich 5,3 oder 5,30000 eingeben, was ein Riesenunterschied ist, aber ich bekomme immer 5,30000 zurück.

          Bei float ist's gerade umgekehrt. Da wird meine genaue Eingabe von 5,30000 auf 5,3 verkürzt.

          Ich muss wohl ein Textfeld nehmen?

          Gast

          1. @@Gast:

            nuqneH

            Ich muss wohl ein Textfeld nehmen?

            Was willst du mit den Werten anfangen? Nur wieder ausgeben oder rechnen?

            Im zweiten Fall wären Strings blöd. Da bieten sich zwei Felder an: eins für den Wert und eins für die Genauigkeit.

            Qapla'

            --
            „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
        2. Tach!

          Ansonsten gibt es mathematisch keinen Unterschied zwischen 5,300000 und 5,3 oder auch 000005,3.
          Doch, es gibt Unterschiede. Der Wert 5,3 kann ein gerundeter Wert sein mit einer Ungenauigkeit (Meßfehler) von 5,25 bis 5,35.
          Ich strebe eine Genauigkeit von 10 m an, also brauche ich fünf Nachkommastellen. Wenn die dann zufällig 5,30000 heißen, ist's ja in Ordnung.

          Du kannst aus 5,3 nicht erkennen, ob die Zahl exakt oder gerundet ist. Du willst keine aufgefüllten Nullen, aber bei Float gehen dir auch nicht signifikante Nullen verloren. Somit bekommst du immer 5,3 zurück, auch wenn du 5,30000 zum DBMS sendest. Wenn du also mit Nullen ausdrücken willst, dass ein Wert exakt 5,3 ist, musst du den als String speichern.

          dedlfix.

          1. n'Abend!

            Wenn du also mit Nullen ausdrücken willst, dass ein Wert exakt 5,3 ist, musst du den als String speichern.

            Okay, dann neue Frage:

            Wenn ich die bisherigen Felder decimal (12,8) in char oder varchar umdefiniere, werden dann die vorhandenen Werte korrekt übertragen in das neue Feldformat?

            Gast

            1. Tach!

              Wenn ich die bisherigen Felder decimal (12,8) in char oder varchar umdefiniere, werden dann die vorhandenen Werte korrekt übertragen in das neue Feldformat?

              Die Frage kannst du mit dem MySQL-Server selbst klären. Kopier die Tabelle in eine neue, mach die Konvertierung und schau das Ergebnis an.

              dedlfix.

              1. Hallo,

                Die Frage kannst du mit dem MySQL-Server selbst klären. Kopier die Tabelle in eine neue, mach die Konvertierung und schau das Ergebnis an.

                Genau so arbeite ich immer. Irgendwas machen, gucken was rauskommt.

                Gast

  2. Tach!

    ich habe für geografische Koordinaten das Format float (12,8) gewählt.
    Kann ich das Feld von bestehenden Tabellen einfach in float umdefinieren? Oder passiert da was Unerwartetes mit den vorhandenen Werten?

    Sicherlich nicht. Es dürfte sich auch intern nichts ändern. Der erste Wert (12 bei dir) hat nur dann einen Einfluss, wenn er größer als 23 wäre, dann nähme MySQL 8 statt 4 Bytes zu speichern. Ohne Angabe werden 4-Byte-Floats verwendet. Also bleibt alles beim alten. Und die 8 hat nur einen Einfluss auf die Anzeige.

    Bei MySQL habe ich keinen Hinweis über den Wertebereich von floats gefunden.

    Das wird der bei 4-Byte-Floats übliche sein, damit man den Wert ohne Umrechung für den Prozessor verwenden kann: Der Exponent geht von -126 bis 127 und die Genauigkeit sind 7 oder 8 Stellen.

    dedlfix.