PHP最左数字

PHP最左数字,php,digits,Php,Digits,假设我有一个包含整数或浮点的变量(因为在PHP中整数可能会溢出到浮点中) 我想运行一些操作来获取最左边的数字和剩余的数字 为了更好地解释: <?php $x = NULL; //this will hold first digit $num = 12345; //int /// run operation //outputs //$x = 1; //$num = 2345; var_dump($x, $num); ?> 现在,我知道如果你把数字表示成一个字符

假设我有一个包含整数或浮点的变量(因为在PHP中整数可能会溢出到浮点中)

我想运行一些操作来获取最左边的数字和剩余的数字

为了更好地解释:

<?php

$x   = NULL;  //this will hold first digit
$num = 12345; //int

/// run operation


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

?>

现在,我知道如果你把数字表示成一个字符串,有很多方法可以做到这一点,但我尽量避免将它转换成字符串

我可能正在寻找一个包含位运算的解决方案,但我在这个问题上相当薄弱,所以我希望通常在低级工作的人能够回答这个问题


非常感谢。

我相信有一种方法可以做到这一点,而不用把它放在绳子上,但为什么呢?
字符串
迂回很容易:

$x = (int)substr($num, 0, 1); 
它会给你一个好的,正确的整数


显然,这不会对错误输入进行扩展检查,并且要求
$num
为有效数字。

获取其余数字

$remainingnum=(int)substr((字符串)$num,1,strlen($num))


如果将值强制转换为字符串,则可以使用数组类型选择器

例如:

$n = (string)12345676543.876543;
echo (int)$n[0];

避免使用任何字符串操作,但不保证浮点值甚至负值

$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);

@Mark Baker提供了最佳解决方案,不过在应用算法之前,您应该先执行abs(floor($num))。

仅数学方法:

function leftMost($num) {  
    return floor($num/pow(10,(floor((log10($num))))));
}
我想是吧

num的1+log10计算一个数字的位数,我们将其降低以删除任何十进制值,将其作为指数,因此对于一个1位数,我们得到10^0=1,或者对于一个8位数,我们得到10^8。然后,我们将12345678/10000000=1.2345678进行除法,得到的是底数d,仅为1

注意:这也适用于0和1之间的数字,在0.02中返回2,字符串转换将失败


如果要使用负数,请先使用$num=abs($num)。

我知道您说过要避免转换为字符串,但如果要在PHP中循环数字,这将是最快的方法:

$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
  $d = $n[$i];
$len=strlen($n);
对于($i=0;$i<$len;++$i)
$d=$n[$i];

在一个快速而肮脏的基准测试中,它比等价的数学表达式集快50%左右,即使在最小化对
log
exp

的调用时,该任务的目的肯定会有所帮助。你要找的是整数除法和模运算符。@Col.Shrapnel:有点复杂,但简单地说,我想从左到右循环每个数字@拉涅利:我来看看,谢谢。我从
$num=12345
得到结果881。对不起,我用了10^而不是pow()。这对负数或0不起作用。您应该使用abs($num)来保证它是正的,并且对于0的特殊情况返回0。或者,如果我在一次编辑中提到$num@adamnfish,您可能会抛出一个错误。而且,零是有史以来最糟糕的数字。一直原因它对0不起作用,因为log10(0)是负无穷大。你的解决方案很好,尽管正确的答案必须交给Mark Baker,因为他也演示了如何获得剩余的数字。也就是说,非常感谢您的解决方案!如果您还想使用float,则需要替换$num=$num%$m;$num=fmod($num,$m);我不明白为什么在字符串之间来回转换字符串是不可能的,但是+1表示的答案符合OP的要求。我想对数学解/字符串操作之间的差异进行基准测试。我知道,优化是万恶之源,但我正在处理成千上万的数字,我有多余的时间来胡闹。我打赌字符串操作会更快,但是,在运行任何性能测试之前,您可能希望查看while循环的微观优化,因为从我自己的测试来看,这不是特别有效的:
返回下限($num/pow(10),(floor((log10($num‘‘‘‘‘‘‘‘‘‘‘‘‘);)需要0.000005秒,返回(int)substr($num,0,1)需要0.000004秒。数字的大小没有显示处理时间的任何变化。PHP手册:也可以使用大括号访问字符串,如$str{42},用于相同的目的。但是,从PHP5.3.0开始,这种语法就被弃用了。使用方括号代替,例如$str[42]。对于-ve num,十进制数,您的解决方案将不起作用。看见