将十进制数字切除到2个位置,但不应该使用ceil来解决它

时间:2014-09-30 14:41:51

标签: php number-formatting

我在PHP中遇到number_format问题,我的代码看起来像这样,

number_format($my_number_with_decimal, 2, '.', ', ');

但是,如果我有一个像111.115这样的数字,它将转换为111.12,这不是我想要显示的,因为它显然舍入了十进制数。有没有一种解决方法,我可以将十进制数限制为2,同时它不会向上或向下舍入?请帮忙。提前谢谢。

6 个答案:

答案 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;
}

http://php.net/manual/en/function.bcdiv.php

答案 5 :(得分:0)

丑陋的方式:

$number = 111.115;
preg_match('/([^.]*\.\d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');