AVG() Funktion, mache ich was falsch oder ist es ein Bug?

AVG() Funktion, mache ich was falsch oder ist es ein Bug?

am 01.12.2007 11:28:05 von Oswaldt Oldenburg

Hallo NG,
ich habe ein ziemlich übles Problem - denke ich zumindest. Bei der
Group-Funktion AVG() bekomme ich unkorrekte Ergebnisse. Eigentlich
erwarte ich, daß 0.95 herauskommen - tun es aber nicht.

CREATE TABLE `dummy` (
`id` int(11) NOT NULL auto_increment,
`x` float default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `dummy` VALUES (1, 0.95);
INSERT INTO `dummy` VALUES (2, 0.95);
INSERT INTO `dummy` VALUES (3, 0.95);
INSERT INTO `dummy` VALUES (4, 0.95);

SELECT avg(x) FROM `dummy` WHERE 1;

Ergebnis:
0.94999998807907

Ich habe es auch bei einer online verfügbaren MySQL-DB versucht - mit
dem selben Ergebnis.

meine Version:
localhost
Server Version: 5.0.45-community-nt

Frei DB im Netz Version:
http://www.db4free.net/
Server version: 5.1.22-rc-log

Wenn ich eine Typumwandlung mache, klappt es korrekt.

SELECT avg( cast( x AS decimal( 16, 6 ) ) ) FROM `dummy` WHERE 1;

Ergebnis:
0.9500000000

Das Problem tritt unabhägig davon auf, wo ich die Query absetzte: ob auf
der Commandline, MySQL-Query-Browser oder .. PhpMyAdmin.

Habt ihr eine Idee dazu?

Vielen Dank für eure Hilfe im Voraus
Oswaldt

Re: AVG() Funktion, mache ich was falsch oder ist es ein Bug?

am 01.12.2007 12:04:21 von Joachim Zobel

Am Samstag, den 01.12.2007, 11:28 +0100 schrieb Oswaldt Oldenburg:
> 0.94999998807907

Du verwendest einen float-Datentyp, zum Beispiel DOUBLE. Da kommt zum
tragen, das 0.2 in dieser Darstellung nicht exakt darstellbar ist. Du
möchtest lieber z.Bsp. DECIMAL(5,2) verwenden.

http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html

Gruß,
Joachim

Re: AVG() Funktion, mache ich was falsch oder ist es ein Bug?

am 03.12.2007 08:46:10 von Oswaldt Oldenburg

Halo Joachim,
Danke für deine schnelle Antwort.

>
> Du verwendest einen float-Datentyp, zum Beispiel DOUBLE. Da kommt zum
> tragen, das 0.2 in dieser Darstellung nicht exakt darstellbar ist. Du
> möchtest lieber z.Bsp. DECIMAL(5,2) verwenden.

Ich wollte in "x" eigentlich Werte von Parametern in SI-Einheiten
speichern, was den Zahlenbereich nicht so einfach auf ein festes
Dezimalformat festlegen läßt.

>
> http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html

Ich hatte das schon befürchtet. Ärgerlicher Weise klappt die Sache in
PostgreSQL. Daher habe ich angenommen, es würde auch in MySQL klappen.
Na egal, wie es aussieht, muß ich dann eben runden. Jedenfalls bin ich
beruhigt, daß es kein Bug ist.

Grüße
Oswaldt