PHP截止小数
什么是在3个字符后舍入(或剪切)PHP浮点的正确方法,而不计算0PHP截止小数,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
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);