假设我有一个包含整数或浮点数的变量(因为整数可能会溢出到PHP中的浮点数中)。
我想运行一些操作来获取最左边的数字和剩下的其余数字。
更好地解释:
<?php
$x = NULL; //this will hold first digit
$num = 12345; //int
/// run operation
//outputs
//$x = 1;
//$num = 2345;
var_dump($x, $num);
?>
现在,我知道如果你将数字表示为字符串,有很多种方法可以做到这一点,但我试图避免将其类型转换为字符串。
我可能正在寻找一个包含按位操作的解决方案,但我在这个主题上相当弱,所以我希望通常低级操作的人可以回答这个问题!
非常感谢。
答案 0 :(得分:11)
我确信有一种方法可以在不将其转换为字符串的情况下执行此操作,但为什么呢? string
绕道很容易:
$x = (int)substr($num, 0, 1);
它会给你一个漂亮的,正确的整数。
显然,这不会对错误输入进行扩展检查,并且需要$num
才能成为有效数字。
答案 1 :(得分:9)
避免使用任何字符串操作,但不保证浮动甚至负值
$x = NULL; //this will hold first digit
$num = 12345; //int
$m = 1;
while(true) {
$m *= 10;
if ($m > $num)
break;
}
$m /= 10;
$x = (int) floor($num / $m);
$num = $num % $m;
//outputs
//$x = 1;
//$num = 2345;
var_dump($x, $num);
答案 2 :(得分:8)
仅数学方法:
function leftMost($num) {
return floor($num/pow(10,(floor((log10($num))))));
}
解释我猜...
1+ log10的num计算一个数字的位数,我们将其置于删除任何十进制值的位置,将其作为指数,因此对于1位数字我们得到10 ^ 0 = 1或8位数字我们得到10 ^ 8。然后,我们只是分配12345678/10000000 = 1.2345678,得到了底线,只有1。
注意:这适用于0到1之间的数字,它将在0.02中返回2,并且字符串转换将失败。
如果您想使用负数,请先使用$ num = abs($ num)。
答案 3 :(得分:0)
获取其余数字
$ remainingnum =(int)substr((string)$ num,1,strlen($ num));
答案 4 :(得分:0)
如果将值转换为字符串,则可以使用数组类型选择器。
例如:
$n = (string)12345676543.876543;
echo (int)$n[0];
答案 5 :(得分:0)
@Mark Baker提供了最佳解决方案,但在应用算法之前应该abs(floor($num))
。
答案 6 :(得分:0)
我知道你说你想避免转换为字符串,但是如果你想在PHP中循环数字,这将是最快的方式:
$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
$d = $n[$i];
在快速而肮脏的基准测试中,它比同等数学表达式快约50%,即使最小化对log
和exp
的调用也是如此。