Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] AVG() und Float

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] AVG() und Float

    Hallo.

    Ich habe eine Tabelle mit nur einem Eintrag: Rating = "3.3".
    Die Ratings sollen in der Form X.X gespeichert werden. Deshalb habe ich sie derzeit als Float gespeichert.

    Wenn ich eine Abfrage mit Average über die Ratings mache, erhalte ich
    Rating = 3.2999999523163 zurück!

    SELECT AVG( rating )
    FROM table
    GROUP BY table.id
    AVG( r.rating )
    3.2999999523163
    Was kann man dagegen tun?


  • #2
    Zitat von chunky Beitrag anzeigen
    Was kann man dagegen tun?
    Runden.

    Oder einen passenderen Datentyp wählen, wenn man sich mit der Rechenungenauigkeit, die bei Float-Zahlen systemimmanent ist, nicht abfinden möchte.

    Kommentar


    • #3
      Ich habe das jetzt auf float(3,2) gesetzt.
      Damit werden die Werte als "3.30" gespeichert. So will ich das haben.
      Vom AVG() wird jedoch "3.300000" ausgegeben.
      Ich könnte die Nullen abschneiden oder runden. Ich will jedoch eine unveränderte Ausgabe haben.
      DECIMAL(3,2) ergibt den selben Wert.

      Kommentar


      • #4
        Was anderes, als das bei der Ausgabe zu formatieren, bleibt dir wohl nicht.

        Kommentar


        • #5
          Ein paar Versuche zu AVG() und ROUND() :

          Code:
          CREATE TABLE test_werte (
            wert DECIMAL (2,1) NOT NULL
          );
          
          INSERT INTO test_werte VALUES
          ( 1.1 ), (2.2), (3.3), (4.4);
          
          SELECT AVG(wert) AS AVG, 
                 ROUND(AVG(wert)) AS ROUND, 
                 ROUND(AVG(wert)*100) AS ROUND_100, 
                 CONVERT ( ROUND(AVG(wert)*100) / 100 , DECIMAL(2,1) ) AS ROUND_CAST
            FROM test_werte;
          Der SQL gibt dann folgendes aus:

          Code:
          +---------+-------+-----------+------------+
          | AVG     | ROUND | ROUND_100 | ROUND_CAST |
          +---------+-------+-----------+------------+
          | 2.75000 |     3 |       275 |        2.8 |
          +---------+-------+-----------+------------+
          1 row in set (0.00 sec)
          
          mysql>
          Über den kleine Trick mit dem *100 und / 100 inclusive eines CONVERT() nach DECIMAL(2,1) gibt es dann doch ein Ergebnis mit einer Nachkommastelle.

          Grüße
          Thomas

          Kommentar


          • #6
            Zitat von thomas_w Beitrag anzeigen
            Über den kleine Trick mit dem *100 und / 100 inclusive eines CONVERT() nach DECIMAL(2,1) gibt es dann doch ein Ergebnis mit einer Nachkommastelle.
            Dumm nur, dass das gar nicht das ist, was er haben wollte.

            Bei den vorliegenden Beispieldaten wäre 2.75 gefragt gewesen.
            Das hätte man gleich mit ROUND(..., 2) oder auch mit TRUNCATE erreichen können (je nachdem, ob mathematisch gerundet oder abgeschnitten werden soll), ohne erst irgendwelche Multiplikationen und anschliessende Divisionen durchzuführen.

            Kommentar


            • #7
              Zitat von ChrisB Beitrag anzeigen
              Dumm nur, dass das gar nicht das ist, was er haben wollte.

              Bei den vorliegenden Beispieldaten wäre 2.75 gefragt gewesen.
              Das hätte man gleich mit ROUND(..., 2) oder auch mit TRUNCATE erreichen können (je nachdem, ob mathematisch gerundet oder abgeschnitten werden soll), ohne erst irgendwelche Multiplikationen und anschliessende Divisionen durchzuführen.
              Stimmt, dass ROUND() noch einen zweiten Parameter hat, habe ich übersehen. Ich hatte mich sowieso schon gewundert, da in anderen Datenbanken, ROUND(x,y) usus ist.

              Grüße
              Thomas

              Kommentar

              Lädt...
              X