PHP如何舍入到小数点后两位?

我需要将PHP中的小数点下舍入到小数点后两位,以便:

49.955 

成为…

 49.95 

我已经尝试过number_format ,但这只是将值增加到49.96 。 我不能使用substr,因为数字可能会更小(如7.950)。 到目前为止,我一直无法find答案。

任何帮助非常感谢。

这可以工作: floor($number * 100) / 100

这是一个很好的function,可以不使用string函数:

 <?php function floorp($val, $precision) { $mult = pow(10, $precision); return floor($val * $mult) / $mult; } print floorp(49.955, 2); ?> 

另一个选项是在舍入之前减去一个分数:

 function floorp($val, $precision) { $half = 0.5 / pow(10, $precision); return round($val - $half, $precision); } 

将你的input乘以100,floor(),然后将结果除以100。

不幸的是,以前的答案(包括被接受的答案)都不适用于所有可能的input。

1) sprintf('%1.'.$precision.'f', $val)

失败的精度为2:14.239应该返回14.23(但在这种情况下返回14.24)。

2) floatval(substr($val, 0, strpos($val, '.') + $precision + 1))

失败,精度为0:14应返回14(但在这种情况下返回1)

3) substr($val, 0, strrpos($val, '.', 0) + (1 + $precision))

失败,精度为0:-1应返回-1(但在这种情况下返回“ – ”)

4) floor($val * pow(10, $precision)) / pow(10, $precision)

尽pipe我广泛地使用了这个,但是最近我发现了一个缺陷。 它也失败了一些价值。 以2:2.05的精度应该返回2.05(但在这种情况下返回2.04 !!)

到目前为止,通过我所有的testing的唯一方法是不幸的是使用string操作。 我基于rationalboss的解决scheme是:

 function floorDec($val, $precision = 2) { if ($precision < 0) { $precision = 0; } $numPointPosition = intval(strpos($val, '.')); if ($numPointPosition === 0) { //$val is an integer return $val; } return floatval(substr($val, 0, $numPointPosition + $precision + 1)); } 

这个函数可以使用正数和负数,也可以使用任何精度。

你可以在这里find一个工作的例子: http : //codepad.viper-7.com/ZGprQJ 。

尝试round()函数

像这样: round($num, 2, PHP_ROUND_HALF_DOWN);

  function roundDown($decimal, $precision) { $fraction = substr($decimal - floor($decimal), 2, $precision); //calculates the decimal places to $precision length $newDecimal = floor($decimal). '.' .$fraction; // reconstructs decimal with new # of decimal places return floatval($newDecimal); } echo roundDown(345.8768378, 5); // OUTPUT: 345.87683 

此function可以与正数和负数结合使用。

代码示例: http : //codepad.org/RAOyBCuY

使用格式化的输出

 sprintf("%1.2f",49.955) //49.95 

DEMO

您可以使用:

 $num = 49.9555; echo substr($num, 0, strpos($num, '.') + 3); 
 sprintf("%1.2f",49.955) //49.95 

如果你需要舍去舍去小数 – 这是不合适的,因为它会正常工作,直到49.95 5结束,如果数字是更多,例如49.95 7它将舍入到49.96
在我看来,LIGHT的地板回答是最普遍的。

你试过round($val,2)吗?

有关round()函数的更多信息