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 :

Boucle avec un pas décimal


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Boucle avec un pas décimal
    Bonjour,

    Je vous soumets un mystère mystérieux que vous avez peut-être déjà rencontré (j'ai parcouru le forum mais sans succès)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    echo "<hr>Boucle While<hr>";
    $start = 8.30;
    $end = 8.60;
    $pas = 0.30;
    $i = $start;
    while($i<=$end)
    {
    	echo $i."<br>";
    	$i+=$pas;
    }
     
    echo "<hr>Boucle FOR <hr>";
     
    $start = 8.30;
    $end = 8.60;
    $pas = 0.30;
     
    for($i = $start; $i<=$end; $i+=$pas)
    {
    	echo $i."<br>";
    }
    Le résultat attendu serait 2 fois deux lignes marquant : 8.30 et 8.60, or comme j'utilise le conditionnel il devient évident que ce n'est pas ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Boucle While
    8.3
    Boucle FOR 
    8.3
    J'imagine que c'est du au fait d'avoir un pas décimal, mais là où le mystère s’épaissit c'est que le code ci-dessous lui renvoi la bonne liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    echo "<hr>Boucle While<hr>";
    $start = 8.30;
    $end = 8.60;
    $pas = 0.10;
    $i = $start;
    while($i<=$end)
    {
    	echo $i."<br>";
    	$i+=$pas;
    }
    Il y a bien un moyen de contournement en multipliant le pas et les limites par 100, et de diviser le résultat par 100, mais j'aurai aimé savoir si vous aviez une autre solution plus pérenne, parce que ce contournement oblige de tester le nombre de décimale pour multiplier par le bon coefficient

    Solution de contournement mis en place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    echo "<hr>Boucle FOR <hr>";
     
    $start = (int) (8.30 * 100);
    $end = (int) (8.60 * 100);
    $pas = (int) (0.30 * 100);
     
    for($i = $start; $i<=$end; $i+=$pas)
    {
    	echo number_format($i/100 , 2) ."<br>";
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    En complément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $start = 8.30;
    $end = 8.60;
    $pas = 0.30;
    $i = $start;
    while(abs($i - $end)<=$pas)
    {
    	echo $i."<br>";
    	$i+=$pas;
    }
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $start = 8.30;
    $end = 8.60;
    $pas = 0.30;
    $i = $start;
    while(bccomp($i,$end,1)<=0)
    {
    	echo $i."<br>";
    	$i+=$pas;
    }

    Fonctionnent. L'explication dans le lien de sabotage

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci Pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser une boucle for avec un pas de 2
    Par ayari.zohra dans le forum Langage
    Réponses: 39
    Dernier message: 27/05/2012, 19h21
  2. [MVC] composer l'attribut id d'un display:table avec un pas dune boucle
    Par DevServlet dans le forum Spring Web
    Réponses: 1
    Dernier message: 05/10/2010, 12h23
  3. condition avec une boucle qui marche pas
    Par lumycaan dans le forum Langage
    Réponses: 5
    Dernier message: 23/10/2009, 20h02
  4. Boucle for avec un pas !
    Par yamatoshi dans le forum Général JavaScript
    Réponses: 29
    Dernier message: 08/04/2009, 11h32
  5. Boucle avec chaine vide : je comprends pas
    Par Zapan dans le forum Langage
    Réponses: 8
    Dernier message: 14/02/2007, 17h27

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