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 :

égalité dans boucle FOR avec incrément décimal de 0.1


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Points : 97
    Points
    97
    Par défaut égalité dans boucle FOR avec incrément décimal de 0.1
    Bonjour,

    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    						$poids_min=0.5;
    						$poids_max=7;
     
    							print('<select name="prono_result_poids" id="prono_result_poids" class="zone_select">');
    								print('<option value="">xxxxxxxxxxxxxxxx</option>');
    								for ($jj=$poids_min;$jj<=$poids_max;$jj=$jj+0.1) {
    									$poids_double=floatval($row_prono["prono_result_poids"]);  // issue d'une BDD mysql, colonne au format decimal
    									$tmp_var=(isset($row_prono["prono_result_poids"]) AND $poids_double==$jj)?" selected ":"";
    									print('<option value="'.$jj.'" '.$tmp_var.'>'.$jj.'</option>');
    								}
    							print('</select> kg');
    et l'égalité ne fonctionne jamais et donc ne sélectionne jamais la bonne ligne dans le SELECT (ça reste au début), ici $row_prono["prono_result_poids"] vaut 2.2

    j'ai converti la donnée issue de ma BDD en double (floatval) étant donné que $jj est un double mais ça ne fonctionne jamais

    quand je mets une égaloite en dur, bien entendu ça fonctionne
      0  0

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Points : 1 280
    Points
    1 280
    Par défaut
    Sérieux ?
    Au XXIème siècle, on utilise encore print() ?

    Vu le commentaire (cf message suivant), autant SUPPRIMER effectivement mon "intervention"... / SOLUTION / POURTANT TRÈS PERTINENTE.
      1  5

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Points : 97
    Points
    97
    Par défaut
    le problème ne vient pas de la façon d'écrire selected ou selected="selected"
    ni ma façon d'utiliser les PRINT : tu écris ton code comme tu le veux

    MAIS de l'incrémentation décimal dans une boucle FOR qui ne supporte pas la comparaison avec un autre double
      0  0

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Points : 97
    Points
    97
    Par défaut
    en fait il ne faut pas utiliser d'incrément décimal dans une boucle FOR

    il y a des incompatibilités (à priori connues) dans la précision des FLOAT à ce niveau

    il vaut donc mieux travailler avec des entiers dans la boucle, puis diviser par 10 dans le corps de cette boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    						$poids_min=5; // correspond en fait à 0.5
    						$poids_max=70; // correspond en fait à 7
    								for ($jj=$poids_min;$jj<=$poids_max;$jj++) {
    									$jj10=$jj/10;
    									$tmp_var=$row_prono["prono_result_poids"]==$jj10)?' selected ':'';
    									print('<option value="'.$jj10.'" '.$tmp_var.'>'.$jj10.'</option>');
    								}
      0  0

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 853
    Points : 44 222
    Points
    44 222
    Par défaut
    mon "intervention"... / SOLUTION / POURTANT [U]TRÈS PERTINENTE.
    Vu que "l’intervention" a été supprimée, cela reste à démontrer.

    ce qui reste de ton intervention :
    Au XXIème siècle, on utilise encore print() ?
    même en PHP8, la fonction n'est pas dépréciée que je sache. Quelle ne soit pas optimum/adaptée dans le cas de figure présent, je veux bien l'entendre mais ce n'était pas la question, et cela n'a rien changé à la problématique.

    Plutôt que de supprimer ton intervention, poses-toi plutôt la question de pourquoi il n'en a pas été tenu compte.

    Le membre a d'ailleurs trouvé une solution tout seul, peut-être pas optimale, peut-être pas la plus propre,mais fonctionnelle pour son cas de figure, et qu'il comprend.
      5  1

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Points : 97
    Points
    97
    Par défaut
    tu dis " peut-être pas optimale, "

    quelle serait la solution plus propre


    marci de m'aider à faire remarquer que jreaux la plupart du temps ne réponds pas à la question (le fond), mais aime critiquer la forme
      0  1

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 853
    Points : 44 222
    Points
    44 222
    Par défaut
    tu dis " peut-être pas optimale, "
    là je parle de l'aspect print/echo qui a été évoqué pas de la réponse supprimée. N'étant pas expert PHP quelqu'un pourra probablement donner un code plus optimal, mais que tu ne comprendra pas forcément selon ton niveau, ce qui peut être pertinent pour te faire avancer, mais t'ajoute une problématique.

    Pour le cas du echo/print, bien que ce ne soit pas le sujet, en gros echo peut prendre plusieurs arguments et est légèrement plus rapide que print, print retourne toujours une valeur de 1, echo ne retourne rien. Mais si tu travailles avec une base de données, tu sera plus gagnant à travailler sur les requête SQL/index de la base de donnés que de remplacer print par echo. Ceci n'est qu'un exemple.

    Dans ton cas de figure, je pense (sans en être sûr) qu'il devrait être possible de faire une boucle avec des flottants sans forcément faire une conversion en entier pour ensuite diviser par 10. Par rapport à ton code d'origine, il faudrait essayer de comprendre pourquoi ça ne marche pas en affichant par exemple les valeurs des variables. tu verras peut-être d'autres solutions tout aussi valables en terme de résultat que celle que tu as trouvé, mais faisant peut-être moins d’opérations.
      0  0

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Points : 97
    Points
    97
    Par défaut
    "mais que tu ne comprendra pas forcément" =+> tu ne connais pas mon niveau, alors ne me jugez pas sur l'utilisation de PRINT, qui est comme tu l'as si bien dit une instruction NON obsolète

    concernant ma problèmatique initiale, il n'y a pas d'autre solution, l'incrémentation d'un double étant sujet à des incoherénces pour le test de l'égalité : de nombreux articles discutent de ça sur Internet
      0  0

Discussion fermée
Cette discussion est résolue.

Discussions similaires

  1. Boucle for avec incrément supérieur à 1
    Par bremer dans le forum Langage
    Réponses: 19
    Dernier message: 22/04/2024, 13h41
  2. Double boucle for avec incrémentation
    Par dubis dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 12/04/2013, 14h29
  3. Boucle for avec incrémentation de variable en shell
    Par Ariania dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 09/08/2012, 12h27
  4. [Smarty] Boucle FOR avec incrémentation
    Par HwRZxLc4 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/07/2010, 21h31
  5. Réponses: 2
    Dernier message: 28/08/2006, 19h17

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