Arrondir à deux décimales un variable (AVG)

Petit nouveau ! | 3 Messages

07 avr. 2011, 14:43

Bonjour,
Je cherche a arrondir à deux décimales une requête Mysql sous PHP.
Voici mon code PHP:
Code:

Code : Tout sélectionner

<?php echo "<br/><b>function(AVG) Group by type</b><br/><br/>"; $con = my_conn(); $query = "SELECT type, AVG(price) FROM produits GROUP BY type"; $result = mysql_query($query) or die(mysql_error()); echo "<table border='1'>"; echo "<tr>"; echo "<th>Type</th>"; echo "<th>Average</th>"; echo "</tr>"; while($row = mysql_fetch_array($result)){ echo "<tr><td>"; echo "<b>".$row['type']."</b>"; echo "</td><td>"; echo "<b><center>".$row['AVG(price)']."</center></b>"; echo "</td></tr>"; } echo "</table>"; mysql_close($con); ?>
Le champ "price" est défini dans MySQL comme FLOAT(4,2).
Le code marche très bien mais me retourne une moyenne avec 6 décimales.
Comment paramétrer la variable $row['AVG(price)'] ???
Merci de votre aide.
PS j'ai essayé sans succés number_format() ainsi que round().

ViPHP
ViPHP | 2577 Messages

07 avr. 2011, 15:37

Bonjour,

Que pose round() comme problème ?

Round(1234.12345678,2) me semble très bien de mémoire.

Petit nouveau ! | 3 Messages

07 avr. 2011, 15:49

bonjour,
Effectivement Round() me parait très bien. Mais je sèche sur le fait de déclarer round() avec ma variable
$row['AVG(price)'] qui vient de la loop : while($row = mysql_fetch_array($result))
Une idée ?

ViPHP
ViPHP | 2577 Messages

07 avr. 2011, 16:03

Bonjour,

echo "<b><center>".round($row['AVG(price)'],2)."</center></b>";
(ca doit marcher)

Autrement pour le SELECT type, AVG(price) FROM produits GROUP BY type, mettre SELECT type, AVG(price) as prix_moyen FROM produits GROUP BY type me semble plus "joli" avec $row['prix_moyen']

Edit :
1) avg_price, ou simplement price ou ce que tu veux peuvent très bien remplacer prix_moyen
2) Pour des prix, j'ai l'habitude de les stocker et manipuler en centimes pour éviter les problèmes d'arrondis et autres bizarrerie des nombres flottants. Je fait la conversion en euro à l'affichage et à la saisie.

De mémoire il arrive que :
$prix = 3.21 et 2 * $prix => 6
alors que $prix = 3.21 et 2.0 * $prix => 6.42

Edit 2 : De toutes facon, il faut faire un traitement sur les montants. Il me semble qu'une facture avec des prix 1234.21 peut être refusée.

Petit nouveau ! | 3 Messages

07 avr. 2011, 16:16

Re bonjour,
Effectivement cela marche. J'avais une erreur de syntaxe au niveau du round().
Merci de ton aide A+

ViPHP
ViPHP | 2291 Messages

24 mai 2011, 19:42

Sinon pourquoi ne pas utiliser ROUND directement dans la requête ?
$query = "SELECT type, ROUND(AVG(price),2) FROM produits GROUP BY type";
A+
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Kevin
Invité n'ayant pas de compte PHPfrance

13 mars 2012, 18:43

Merci pour cette réponse. La méthode SQL trés pratique.
Cordialement

Mammouth du PHP | 2278 Messages

14 mars 2012, 11:51

Ce n'est pas directement en rapport, mais la question m'a rappelé des stocks d'ennuis que j'avais eus avec une application de paie en DBASE, justement sur les décimales et les arrondis. Dbase ne connaissait pas le Décimal codé binaire.
Il me semble que le type Decimal de mysql est assez sympa...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 2278 Messages

15 mars 2012, 16:48

Ce qui risque d'être refusé, c'est une facture où, du fait des arrondis, le TTC est différent du HT+TVA et où
la somme des sommes horizontales diffère de la somme des sommes de colonnes
pro_1 HT1 TVA1 TTC1
pro_2 HT2 TVA2 TTC2
somme HT1+ HT2 TVA1+TVA2 doit être égale à TTC1+TTC2
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD