Ваше пока условие неверно, вы никогда не достигнете 0, ну, конечно, до тех пор, пока ваш float не может быть более точно оценен. Поскольку вы делите число ($num
) на 10 и устанавливаете результат на $num
на каждой итерации, $num
становится все ближе и ближе к нулю. Когда вы делите ненулевое число таким образом, оно становится все ближе и ближе к нулю, но фактически никогда не достигнет 0 ( Вы обнаружили предел бесконечности ). Причина, по которой ваш код не вызывает бесконечности l oop и cra sh, заключается в том, что PHP (и все языки) ограничены тем, насколько маленьким (или большим) из числа может представлять одна переменная. Взгляните на this PHP do c для чисел с плавающей запятой , чтобы узнать больше о значениях с плавающей запятой и их возможной точности. Как только значение $num
станет достаточно маленьким, PHP больше не сможет точно представлять значение, ведущее к 0
. Что, как вы обнаружили, занимает 325
итераций при запуске с 1000
.
Вместо этого вам следует проверить, когда ваш $num
становится меньше 1
.
Пример:
<?php
$x = 0;
$num = 1000;
do {
$x++;
$num /= 10;
} while($num >= 1);
echo $x;
Пример в реальном времени
Использование исходного условия
Вы можете использовать свое исходное условие в то время как $num != 0
, если вы измените свой расчет на округление $num
вниз до ближайшего целого числа. Например:
<?php
$x = 0;
$num = 1000;
do {
$x++;
$num = floor($num / 10);
} while($num != 0);
echo $x;
Пример Live