对于练习,我编写了这个小循环,将十进制数转换为二进制数。它返回正确的值,我测试了它,但它在输出中附加了很多零。
$dec = 17;
$bin = null;
while($dec != 0)
{
$bin .= $dec % 2;
$dec /= 2;
round($dec, 0, PHP_ROUND_HALF_DOWN);
}
echo $bin;
我真的不知道为什么会这样,我是盲人吗?你能给我一个解释吗?我会很感激。
我试图测试$dec == 0
,如果成功break;
像这样:
while($dec != 0)
{
$bin .= $dec % 2;
$dec /= 2;
round($dec, 0, PHP_ROUND_HALF_DOWN);
if($dec == 0)
{
break;
}
}
那没用。所以我正在寻找解决方案。我在这里先向您的帮助表示感谢!乔纳
循环的问题是$dec /= 2
不是整数除法。如果在循环中打印出$dec
,您将看到值为8.5,4.25,2.125,......等等,直到最终$dec
成为可能的最小双精度值,此时在下一个循环中它最终变为0。你正在调用round
,它应该解决这个问题,你没有将round
的输出分配给$dec
所以它没有效果。最好先进行整数除法。在PHP7及更高版本中,您可以使用intdiv
:
$dec = intdiv($dec, 2);
或者在任何PHP版本中,简单的右移都有效:
$dec = $dec >> 1;
否则,您可以使用intval
,floor
或round
或(int)
强制转换将浮点结果转换为整数:
$dec = intval($dec / 2);
$dec = floor($dec / 2);
$dec = round($dec / 2, 0, PHP_ROUND_HALF_DOWN);
$dec = (int)($dec / 2);
另一个问题是您需要以相反的顺序将值推入$bin
字符串,因此您需要更换
$bin .= $dec % 2;
同
$bin = ($dec % 2) . $bin;
所以一个示例循环将是:
$dec = 24;
$bin = null;
while($dec != 0)
{
$bin = ($dec % 2) . $bin;
$dec = $dec >> 1;
}
echo $bin . PHP_EOL;
输出:
11000
好吧,我发现了你的问题:如果你已经调试了你的循环,你会发现$dec
在每一步都只有一半。对round
的调用不会执行任何操作,因为您不使用返回的值。只需将其分配给$dec