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

  • chunky
    hat ein Thema erstellt [Erledigt] AVG() und Float.

    [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?

  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • chunky
    antwortet
    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.

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X