【问题标题】:PHP cut off decimalPHP 截断小数
【发布时间】:2018-07-05 18:21:05
【问题描述】:

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

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

【问题讨论】:

  • 你是什么意思......对于“ 3个字符后” ???? 0.12345 => 0.123 可以,但 0.0001239 => 0.000124 ???????
  • @scaisEdge: 如图所示:1 想要在第一个非零数字之后的 3 个位置。 Round 不是解决方案,因为 round(0.0001, 3) 给出 0 的结果。发布的解决方案 bij Andreas 是我正在寻找的:2 行而不是我编写的复杂脚本。坦克的所有帮助!

标签: php floating-point precision number-formatting


【解决方案1】:

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

$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 数字。

【讨论】:

  • 谢谢!为
【解决方案2】:

你需要一些自定义的东西来检测由这个组成的零的数量 PHP - Find the number of zeros in a decimal number 和圆形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

请注意,由于第三个数字有点奇怪,我无法做太多舍入

【讨论】:

    【解决方案3】:

    您可以使用一些增加率,这取决于您在. 之后和第一个数字之前有多少个零。如果您只需要在 3 个字符后剪切,则可以使用 round 而不是 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多