检查数字1的十进制数字

问题描述 投票:-2回答:3

我有数百个数字,如:

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

非常感谢你的帮助。

php regex count rounding
3个回答
0
投票

我不会太依赖你在答案中发布的方法。请改用以下功能:

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进行测试。


0
投票

看起来我找到了一个解决方案,使用strpos()功能完美的工作!

基本上:

strpos(0.01000000, 1)

0
投票

我说使用正则表达式是合适的,当微优化不是最高优先级,当它减少总函数调用,并且当它提供直接的,期望的结果时。

考虑到你的情况和样本输入,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";
}
© www.soinside.com 2019 - 2024. All rights reserved.