PHP截止小数

时间:2018-01-26 11:54:04

标签: php floating-point precision number-formatting

在3个字符后舍入(或剪切)PHP浮点数的正确方法是什么,不计算0?

Example:
0.12345 => 0.123
0.012345 => 0.0123
0.0001239 => 0.000124

4 个答案:

答案 0 :(得分:0)

您可以使用正则表达式捕获与数字分开的零和点,并单独处理它们。

$arr = [0.12345,0.012345,0.0001239];

Foreach($arr as $val){
    Preg_match("/([0\.]+)([0-9]+)/", $val, $match);
    Echo $match[1]. Substr(round("0.".$match[2],3),2,3)."\n";
}

https://3v4l.org/DZFV4

第一个捕获组的正则表达式正在抓取0并且点贪婪,因此捕获序列中的任何点或零。
然后第二组捕获0-9,但由于第一组是贪婪的,所以不能从0开始 所以第二组必须从1-9开始,然后是0-9位。

答案 1 :(得分:0)

你需要一些自定义的东西来检测由此构成的零的数量 PHP - Find the number of zeros in a decimal numberhttp://php.net/manual/en/function.round.php

$num1 = 0.12345;
$num2 = 0.012345;
$num3  = 0.0001239;

echo "<br/><br/> Three zero places rounding number 1 : " .  threeZeroPlaceRounding($num1); 
echo "<br/><br/> Three zero places rounding number 2 : " .  threeZeroPlaceRounding($num2); 
echo "<br/><br/> Three zero places rounding number 3 : " .  threeZeroPlaceRounding($num3); 

function threeZeroPlaceRounding($number)
{
    $numzeros = strspn($number, "0", strpos($number, ".")+1);
    $numbplus = $number + 1;

    return round($numbplus, $numzeros + 3) - 1;
}

输出

舍入数字1的三个零位: 0.123

舍入数字2的三个零位: 0.0123

三个零位四舍五入: 0.00012400000000001

请注意,我不能为第三个数字的舍入做一些有点奇怪的事情

答案 2 :(得分:0)

你可以使用一些增长率,这取决于.之后和第一个数字之前你有多少零。相反,round如果您只需要在3个字符后剪切,则可以使用substr

$arr = [0.12345, 0.012345, 0.0001239];

$outputArr = [];
foreach ($arr as $arrValue) {
  $zeroCount = strspn($arrValue, "0", strpos($arrValue, ".")+1);
  $increaseRate = pow(10, $zeroCount);

  $outputArr[] = (float)(round($arrValue*$increaseRate, 3)/$increaseRate);
}

print_r($outputArr);

答案 3 :(得分:-1)

您可以使用number_format()执行此操作,并首先编写在点之后计算零的函数:

function countPrecision($n){
    $p = 0;
    $n = substr($n, 2);
    foreach(str_split($n) as $i)
    {
        if($i == '0')
            $p += 1;
        else
            break;
    }
        return $p;
}

$n = 0.12345; //your number
$p = countPrecision($n) + 3

echo number_format((float) $n, $p, '.', '');