IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fonction floor délirante


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut Fonction floor délirante
    Bon...
    Ce soir je suis tombé soit sur un mystère, soit sur un truc de merde, soit sur un truc que j'ai pas bien compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $level = pow($mylevel,3);
    $final = floor(pow($level/count($data),1/3));
    Voilà un bout de code de mon appli, jusque là rien de bien sorcier.
    Quand je donne les valeurs, ça l'est encore moins :
    $mylevel = 11;
    count($data) = 1;

    Ben mon résultat de final c'est 10...

    Pour voir un peu j'ai fait des affichages, ai vu que c'était le floor le problème, je me suis dit, bon ben intval, mais pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo pow($level/count($data),1/3).'<br/>';
    $test = pow($level/count($data),1/3);
    echo floor(pow($level/count($data),1/3)).'<br/>';
    echo intval(pow($level/count($data),1/3)).'<br/>';
    echo floor($test).'<br/>';
    M'affiche :
    11
    10
    10
    10

    Hum, dites moi par pitié que j'ai fait un truc mal, et que c'est pas php qui déraille, parce que là ça me semble presque... inquiétant ... ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    pour moi, c'est un comportement normal...
    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump( pow($level/count($data),1/3) );
    Tu verras que c'est un float. La précision est de 14 je crois... Une fois "casté" en entier, tu perds des informations, ce qui explique ce problème d'arrondis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ((int) pow($level/count($data),1/3) );
    Un exemple de "problème" de précision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo (int) ( (0.1 + 0.7) * 10 )
    Essaye ça, tu sera surpris du résultat...

  3. #3
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Donc en gros il n'y a aucun moyen d'arrondir des chiffres sous php ?

    Pas mal comme comportement normal ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Linio Voir le message
    Donc en gros il n'y a aucun moyen d'arrondir des chiffres sous php ?

    Pas mal comme comportement normal ...
    La réponse est dans la question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo floor( round( pow($level/count($data),1/3) , 1) );

  5. #5
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Hmmm...

    Je vais tester ça, mais bon...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Sinon tu peux te tourner vers la librairire bcmath, je m'en sert de temps lorsque j'ai des soucis d'arrondis.

    bye

  7. #7
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Je vais regarder ça parce qu'à bien y réfléchir la solution précédente ne fonctionne pas (en tout cas elle n'arrondit pas comme je veux).

    Un peu hallucinant ce truc.
    Je vais essayer un cast vu qu'à l'affichage il me le fait bien ... ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Je vais essayer un cast vu qu'à l'affichage il me le fait bien ... ?
    Oui tu peux essayer, mais bon fais quelques tests tout de même.

    soit dit en passant, le problème des nombres à virgule à flottante est assez pourri disons le. Représenter un 1.333333333 (333333 à l'infini) dans un espace mémoire fini, c'est quand même assez compliqué ; )

  9. #9
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Oui enfin c'est peut être compliqué, mais ça chez moi :

    float(11)

    c'est limpide comme représentation...

    Donc quand un floor de ça me donne 10, désolé mais moi j'appelle ça un bug, pas une feature...

Discussions similaires

  1. [WD15] SQL: Fonction FLOOR
    Par SevenSoftware dans le forum WinDev
    Réponses: 2
    Dernier message: 22/09/2010, 18h16
  2. Fonction Round et Floor
    Par sondo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/10/2008, 11h29
  3. Problème avec la fonction floor de <math.h>
    Par moussmouss dans le forum C
    Réponses: 7
    Dernier message: 20/07/2007, 12h41
  4. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo