我在PHP中遇到number_format
问题,我的代码看起来像这样,
number_format($my_number_with_decimal, 2, '.', ', ');
但是,如果我有一个像111.115
这样的数字,它将转换为111.12
,这不是我想要显示的,因为它显然舍入了十进制数。有没有一种解决方法,我可以将十进制数限制为2,同时它不会向上或向下舍入?请帮忙。提前谢谢。
答案 0 :(得分:4)
你想要什么在逻辑上是不可能的:
11.11 <= 11.115 <= 11.12
将11.115
截断为11.11
正在四舍五入,无论你如何看待它。
答案 1 :(得分:3)
如果您只想保留前两位数,请执行以下操作:
floor($my_number_with_decimal * 100) / 100;
这相当于四舍五入。
答案 2 :(得分:0)
你知道有多少整数? 假设你这样做,你可以通过切片来切断它。比如说您的数字是整数格式:
$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;
如果数字已经是字符串格式,您可以这样做:
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
这可能不是最好的或最干净的,并且没有经过测试,但我希望我能提供帮助。
答案 3 :(得分:0)
您可以尝试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);
哪个应该返回111.11
。
答案 4 :(得分:0)
正如@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;
}
答案 5 :(得分:0)
丑陋的方式:
$number = 111.115;
preg_match('/([^.]*\.\d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');