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:
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:
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:
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:
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>";
} |