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()
函数的更多信息