我在PHP中遇到了一个涉及number_format
的问题,我的代码看起来像这样,
number_format($my_number_with_decimal, 2, '.', ', ');
然而,如果我有一个像这个111.115
这样的数字,它将转换为111.12
,这不是我想要显示的,因为它显然对十进制数字进行了四舍五入。有没有一种变通方法,我可以将十进制数字限制为2,同时不会向上或向下取整?请帮忙。提前谢谢。
您想要的在逻辑上是不可能的:
11.11 <= 11.115 <= 11.12
无论怎么看,将11.115
截断为11.11
都是四舍五入。
如果您只想保留前两位数字,只需执行:
floor($my_number_with_decimal * 100) / 100;
这相当于四舍五入。
您可以尝试floor()
你可以有这个UDF:
function mine($num,$n=0){ //$n is number of decimal places
return (floor($num*(pow(10,$n)))*pow(10,$n));
}
并称之为:mine(111.115,2);
其应当返回CCD_ 8。
正如@Marc B所指出的,截断等于floor
。因此,你可以使用简单的数学运算来计算特定数量的数字:
echo floor($input * 100) / 100;
请记住,floor
是基于浮点值的,浮点值不是很精确。你可能会在vera大数字上得到奇怪的结果。bc
函数族可以进行浮点运算,而不会出现舍入或地板问题!
http://php.net/manual/en/function.floor.php
这是一个使用bc函数的floor函数。如果地板有问题,可以试试。
function floor($number, $prec = 0) {
$number = $number * pow(10,$prec);
$number = bcdiv($number, pow(10,$prec), $prec);
return $number;
}
http://php.net/manual/en/function.bcdiv.php
你知道有多少个整数吗?假设你这样做了,你可以通过切片来切断它。例如,用整数格式的数字:
$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;
如果数字已经是字符串格式,您可以执行以下操作:
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
这可能不是最好或最干净的,也没有经过测试,但我希望我能帮上忙。
丑陋的方式:
$number = 111.115;
preg_match('/([^.]*'.'d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');