Цикл For не работает для значений с плавающей запятой - PullRequest
6 голосов
/ 07 ноября 2011

у меня есть цикл for, как показано ниже

<?php 

 for($i=0;$i<=10;$i+0.4){

 echo $i."<br>";
 }

 ?>

этот код печатает значение i до 9,6, а не 10.

почему он возвращает значение i = 10, наконец.

Ответы [ 7 ]

3 голосов
/ 07 ноября 2011

из-за представления чисел с плавающей запятой для машин - http://en.wikipedia.org/wiki/Floating_point

Я бы рекомендовал использовать целочисленные индексы для циклов

3 голосов
/ 07 ноября 2011

Используйте += для увеличения, а не просто плюс. Как и сейчас, для меня это бесконечный цикл.

Редактировать: По некоторым причинам PHP не работает должным образом с различными типами в циклах.

Это ниже должно работать

for($i=0;$i<=100;$i+=4){
   echo $i/10."<br>";
 }

Вот var_dump

int(0)

float(0.4)

float(0.8)

float(1.2)

float(1.6)

int(2)

float(2.4)

float(2.8)

float(3.2)

float(3.6)

int(4)

float(4.4)

float(4.8)

float(5.2)

float(5.6)

int(6)

float(6.4)

float(6.8)

float(7.2)

float(7.6)

int(8)

float(8.4)

float(8.8)

float(9.2)

float(9.6)

int(10)

Вероятно, это происходит при автоматическом приведении, которое вызывает этот

2 голосов
/ 07 ноября 2011

Существует проблема с точным сравнением FLOAT (которое происходит в <<strong> = ).

Сделайте это так:

 for($i=0; $i<=100; $i+=4){
     echo ($i/10)."<br>";
 }
1 голос
/ 27 января 2013

<?php

for($i=0;$i<10;$i+0.4){

echo $i."<br>";

}

?>

, если выустановите i <= 10, тогда он продолжит печатать до значения 10, но если удалить знак =, то он остановится на 9! </p>

1 голос
/ 09 января 2013

Для точного сравнения вы можете округлить это значение, как показано ниже ...

<?php

   for($i=0; round($i,1) <= 10; $i += 0.4){
      echo $i."<br/>";
   }

?>
1 голос
/ 07 ноября 2011

Вы можете сделать:

<?php 

 for($i=0;$i<=100;$i += 4){

 echo ($i/10)."<br>";
 }

 ?>

результат здесь: http://codepad.org/CxvzEUeq

0 голосов
/ 07 ноября 2011

При сравнении необходимо использовать значение epsilon, которое обозначает допустимую ошибку при сравнении значений с плавающей запятой.

$epsilon=0.000001; //a very small number

for($i=0; $i<10 or abs($i-10)<$epsilon; $i+=0.4){
   echo $i."<br>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...