我有数百个数字,如:
0.00100000
0.01000000
0.01000000
1.00000000
0.00001000
0.00000100
我需要检查数字1在这些数字中的位置,所以基本上
1.00000000 = 1
0.10000000 = 2
0.01000000 = 3
我尝试过Round()
功能,但它有时打印的数字像1.E-6或类似的东西,我需要1号的确切位置。
非常感谢你的帮助。
我不会太依赖你在答案中发布的方法。请改用以下功能:
function index_of_one($dec)
{
// maximum precision is 15
$str = str_replace('.','',sprintf('%.15f', $dec));
$pos = strpos($str, '1');
if ($pos === false) {
return -1;
}
return ($pos + 1);
}
例:
$dec1 = 1.00000000;
$dec2 = 0.10000000;
$dec3 = 0.00010000;
echo index_of_one($dec1); // 1
echo index_of_one($dec2); // 2
echo index_of_one($dec3); // 5
访问this link进行测试。
看起来我找到了一个解决方案,使用strpos()
功能完美的工作!
基本上:
strpos(0.01000000, 1)
我说使用正则表达式是合适的,当微优化不是最高优先级,当它减少总函数调用,并且当它提供直接的,期望的结果时。
考虑到你的情况和样本输入,preg_match_all('/[^.](?=[^1]*1)|1.*/',$number)
一步到位。它匹配每个单独的非点字符,后面跟着1
或从1
到字符串的末尾。
(Qazxswpoi)
Regex Pattern Demo的返回值是匹配的数量,因此它可以提供您所要求的 - 计数。
实际上,点数不计算,也不是第一个preg_match_all()
之后的任何字符。如果没有找到1
,则计数为1
(不是其他答案所建议的-1)。
这是一个带有一系列测试的演示(0
):
Demo
输出:
$numbers=['0.00100000','0.10000000','0.01000000','1.00000000','0.00001000','0.00000100','0.00000000'];
foreach($numbers as $number){
echo "$number = ",preg_match_all('/[^.](?=[^1]*1)|1.*/',$number),"\n";
}