PHP截止小数

PHP截止小数,php,floating-point,precision,number-formatting,Php,Floating Point,Precision,Number Formatting,什么是在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, $ma

什么是在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";
}

第一个捕获组捕获0和贪婪点,因此捕获序列中的任何点或零。
然后第二组捕获0-9,但由于第一组是贪婪的,因此不能从0开始。

因此,第二组必须从1-9开始,然后是任何0-9位。

您需要一些定制的东西来检测由这个数字组成的零的数量 圆圆的

$num1=0.12345;
$num2=0.012345;
$num3=0.0001239;
回声“

三个零位取整数字1:”。三舍五入($num1); 回声“

三个零位取整数字2:”。三舍五入($num2); 回声“

三个零位四舍五入数字3:”。三舍五入($num3); 函数threeZeroPlaceRounding($number) { $numzeros=strspn($number,“0”,strpos($number,”)+1); $numbplus=$number+1; 返回回合($numplus,$numzeros+3)-1; }
输出为

三个零位取整数字1:0.123

三个零位取整数字2:0.0123

四舍五入数字3的三个零位:0.000124000000001


注意,对于第三个数字的四舍五入有点奇怪,我无能为力。你可以使用一些增加率,这取决于在第一个数字之后和之前有多少零。相反,如果只需要在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个字符之后”????0.12345=>0.123正常,但0.0001239=>0.000124?????scaisEdge:如图所示:1希望在第一个非零位之后有3个位置。圆形isn;t将溶液四舍五入(0.0001,3)得出0 als结果。bij Andreas发布的解决方案正是我想要的:2行而不是我写的复杂脚本。谢谢你的帮助!谢谢为小于0.0001预匹配的数字添加了数字格式(“/([0\.]+)([0-9]+)/”,数字格式($val,10),$match);
$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);