Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查数字1在十进制数中的位置_Php_Regex_Count_Rounding - Fatal编程技术网

Php 检查数字1在十进制数中的位置

Php 检查数字1在十进制数中的位置,php,regex,count,rounding,Php,Regex,Count,Rounding,我有数百个数字,比如: 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的确切位置 非常感谢您的帮助。看来我找到了一个解决方案,使用了strpos()函数,效果非常好 基本上: strpos(0.0

我有数百个数字,比如:

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的确切位置


非常感谢您的帮助。

看来我找到了一个解决方案,使用了
strpos()
函数,效果非常好

基本上:

strpos(0.01000000, 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

请访问以测试它。

我说,当微优化不是首要任务时,当它减少了总的函数调用时,当它提供了直接的、期望的结果时,使用regex是合适的

考虑到您的案例和示例输入,
preg_match_all('/[^.](?=[^1]*1)| 1.*/',$number)
一步到位。它匹配每个单独的非点字符,后面跟一个
1
,或者从
1
到字符串的末尾

()

preg\u match\u all()
的返回值是匹配数,因此它提供的正是您所要求的——一个计数

实际上,第一个
1
之后的点和任何字符都不会被计数。如果未找到
1
,则计数为
0
(而不是其他答案所建议的-1)

下面是一组测试()的演示:

输出:

0.00100000 = 4
0.10000000 = 2
0.01000000 = 3
1.00000000 = 1
0.00001000 = 6
0.00000100 = 7
0.00000000 = 0

我无法想象你怎么认为舍入会有什么帮助。我以为舍入会去掉零(它实际上是这样做的!),然后我就可以计算数字了。回音舍入('0.00001000');=0,那么你要找的是1,那么四舍五入(0.01000000,2)=0.01,然后数数呢?基本上,输出将是我正在寻找的3。难道你不明白吗?你总是在找一个?它永远不可能是0.00200000?非常感谢,你说的是真的,带点的STRPO将从第一个小数位开始偏移数字。非常感谢。
0.00100000 = 4
0.10000000 = 2
0.01000000 = 3
1.00000000 = 1
0.00001000 = 6
0.00000100 = 7
0.00000000 = 0