1
votes

La fonction MySQL AVG donne plus de décimales que prévu

J'ai des données stockées dans MySQL DB version: 10.1.37-MariaDB, innodb_version: 5.6.41-84.1. J'exécute une requête pour obtenir la moyenne d'une colonne en utilisant AVG. 3 lignes sont renvoyées et les valeurs moyennes sont 18,06, 18,44 et 20,05. La question est de savoir pourquoi AVG renvoie 18.849999999999998? Le type de données de la colonne est double.

select avg(col_0) from table where col_1='xxx' and col_2='yyy';


1 commentaires

Probablement parce que le type de données est double, ce qui n'est pas le même que DECIMAL


3 Réponses :


1
votes

Vous pouvez utiliser round ():

select CAST(avg(col_0),2) AS DECIMAL (10,2)) from table where col_1='xxx' and col_2='yyy';

Cela vous donnera 2 décimales.

Vous pouvez également utiliser CAST ()

select ROUND(avg(col_0),2) from table where col_1='xxx' and col_2='yyy';


0 commentaires

0
votes

Vous pouvez utiliser le FORMAT

select FORMAT(avg(col_0),2) from table where col_1='xxx' and col_2='yyy';


0 commentaires

1
votes

Double n'est pas un type exact, c'est une version plus précise de float. Vous devez utiliser un type de colonne numérique exact, si vous voulez une précision exacte. Depuis la documentation de MySQL:

Les types DECIMAL et NUMERIC stockent des valeurs de données numériques exactes. Ces types sont utilisés lorsqu'il est important de conserver une précision exacte, par exemple avec des données monétaires. Dans MySQL, NUMERIC est implémenté comme DECIMAL, donc les remarques suivantes sur DECIMAL s'appliquent également à NUMERIC.

Vous pouvez contourner ce problème du côté de la présentation en arrondissant, mais utilisez un type numérique exact pour une solution à plus long terme.


0 commentaires