problème fonction round()

Eléphanteau du PHP | 18 Messages

12 juin 2011, 10:04

Bonjour,

J'ai un problème avec la fonction round() qui ne marche pas correctement par exemple :

round(5.04589,3) //result 5.0460000000000002629

Normalement je devrais avoir comme résultat 5.046, j'ai peux utiliser number_format() mais je trouve pas ça propre.

Merci d'avance
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juin 2011, 10:23

Effectivement, number_format() ne sert qu'à gérer la mise en forme pour de l'affichage...

Cependant "echo round(5.04589,3);" affiche bien 5.046. Ton problème doit donc provenir d'ailleurs.. par exemple si tu demandes l'affichage d'un nombre qui a moins de 3 décimales ou si tu stockes ton nombre arrondi dans un champ de type double...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

12 juin 2011, 10:42

Ce que j'ai pas dit encore c'est qu'avant ça marché très bien mais j'ai transféré mon site sur mon serveur dédié (Linux distribution Ubuntu) et j'ai installé les services apache2/php5/mysql-server et phpmyadmin.

Et je pense que le problème est lié dans un fichier de configuration car avant ça marché très bien. Enfin je trouve quand même très étrange et j'ai fais de multiple recherche sur le web, j'ai rien trouvé :/

Sinon je viens d'essayé de changé le type du champ en double et ça marche correctement...mais quand je met une valeur à la "mano" dans la fonction round() j'ai toujours le même problème.

En plus toute les données calculées ne se trouvent pas dans une table :/
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

ViPHP
ViPHP | 2577 Messages

12 juin 2011, 11:56

Bonjour,

Le stockage des réels entraînent quelques approximation sur les valeurs.
$a = ???.?????????;  un nombre quelconque
$b = ???.?????????;  un autre nombre quelconque
$c = $a * $b;
$c = $c / $b;
$c = $c - $a;
echo $c; ne donnera certainement pas 0      

Eléphanteau du PHP | 18 Messages

12 juin 2011, 19:54

En fait j'ai toujours le même problème même en changeant le type de champs.

Donc je pense vraiment que ça vient d'un problème lié à la configuration php5

Ideas ?
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juin 2011, 20:21

Il faudrait déjà identifier le problème... A quel moment exactement est-ce que tu constates ce problème d'arrondi ?
Avec quelle valeur est-ce que ça ne fonctionne pas ?
Quelle valeur obtiens-tu juste après le round de cette valeur ?
Que fais tu de cette valeur après avoir fait le round et avant de l'afficher ou de l'utiliser ?
...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

12 juin 2011, 21:51

J'obtiens exactement cela
round(5.04589,3) //result 5.0460000000000002629
Et je l'obtiens ça à toute mes valeurs et ce depuis le transfert du site sur mon serveur dédié..
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 juin 2011, 00:29

Désolé de paraître insistant, mais comme tu ne réponds pas à ma question...

Dans ton script php tu fais bien un echo du round(), et c'est ce echo qui t'affiche ce nombre à l'écran ? Tu n'as pas de calcul, de récup de la valeur en base ou autre... En gros, si dans un script de test tu colles uniquement le code
<?php echo round(5.04589,3); ?>
ça t'affiche "5.0460000000000002629" à l'écran ?

C'est quoi la version de php sur ton dedié ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

13 juin 2011, 10:59

Excuse moi, oui je fais un <?php echo round(5.04589,3); ?> et réponse j'ai 5.0460000000000002629 à l'écran

La version de mon php "5.3.5-1ubuntu7.2"
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

devlop78
Invité n'ayant pas de compte PHPfrance

14 juin 2011, 00:50

C'est marrant. Parce que autant le nombre ne me surprend pas étant donné la méthode de calcul binaire, mais en général quand tu fais un echo le résultat est normal.

En fait, le problème a déjà été soulevé, et il s'avère que l'ordinateur obtient bien 5.0460000000000002629 lorsqu'il fait ton calcul, tout simplement parce que ... enfin voilà. As-tu essayé avec les fonctions mathématiques adaptées ?

Je te conseille de lire
http://php.net/manual/fr/language.types.float.php
Les nombres décimaux ont une précision limitée. Même s'ils dépendent du système, PHP utilise le format de précision des décimaux IEEE 754, qui donnera une erreur maximale relative de l'ordre de 1.11e-16 (dûe aux arrondis)
Quand on regarde ton chiffre, on est sur du environ 10e-16 où commence l'erreur
Ceci peut mener à des résultats confus: par exemple, floor((0.1+0.7)*10) retournera normalement 7 au lieu de 8 attendu, car la représentation interne sera quelque chose comme 7.9999999999999991118....
Au final, moi j'avais, avant de lire ces articles, toujours pensé que les mathématiques étaient ce que faisait de mieux un ordinateur, mais non ^^ Le résultat s'explique mais c'est une histoire de stockage de chiffre avec une puissance, le tout en binaire, et comme le nombre de chiffre est limité, il y a une perte au niveau de la précision.

Mais sérieusement je rigole avec ça, mais tu devrais te tourner vers http://www.php.net/manual/fr/ref.bc.php

Eléphanteau du PHP | 18 Messages

14 juin 2011, 21:55

Je suis d'accord avec toi mais le problème ce que ce problème n'apparaissait pas avant et que sur le nouveau serveur il apparait donc il y a bien un truc de différent qui ne se passe pas comme avant mais maintenant il s'agit de cherché pourquoi j'ai ce problème sur cette config.

Cordialement :)
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

devlop78
Invité n'ayant pas de compte PHPfrance

14 juin 2011, 23:24

Hmm ... Regarde le phpinfo(), la précise de nombre à virgules, etc.

Eléphanteau du PHP | 18 Messages

16 juin 2011, 01:47

Hmm ... Regarde le phpinfo(), la précise de nombre à virgules, etc.
A quoi correspond "la précise de nombre à virgules" dans phpinfo, car je ne sais pas du tout où regarder :/
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 09:34

Bonjour,

As tu la possibilité de travailler avec des entiers ?
Ca résoudrait pas mal de problèmes que de faire les calculs avec des entiers et de gérer l'affichage et les entrées pour les virgules.

Eléphanteau du PHP | 18 Messages

16 juin 2011, 12:45

J'ai besoin de précision pour mes calcules car se sont des données météo.

Je continu à chercher de mon coté mais je commence à désespérer car je trouve rien :/
http://www.meteo-gironde.net - Toute la météo en Aquitaine et par ville pour la France entière.