簡體   English   中英

PHP截止小數

[英]PHP cut off decimal

什么是在3個字符后舍入(或剪切)PHP浮點數的正確方法,不計算0?

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

您可以使用正則表達式捕獲與數字分開的零和點,並單獨處理它們。

$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位。

你需要一些自定義來檢測由這個PHP組成的零的數量 - 查找十進制數中的零數並舍入http://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

舍入3號的三個零位: 0.00012400000000001

請注意,我不能做很多關於第三個數字的舍入有點奇怪

你可以使用一些增長率,這取決於你擁有多少零. 在第一個數字之前。 相反, round您可以使用substr如果你需要經過3個字符只切割。

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

您可以使用number_format()和第一個寫入函數來執行此操作,該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, '.', ''); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM