PHP舍入函数-舍入到2 dp?

PHP舍入函数-舍入到2 dp?,php,math,rounding,Php,Math,Rounding,在PHP中,如何将值22.04496取整为22.05?看来 四舍五入(22.04496,2)=22.04。是否应该是22.05 提前感谢为什么应该是22.05?第三个小数点小于5,因此当您将其四舍五入到2个小数点时,它将被四舍五入到22.04PHP的round函数可以处理一个额外的参数,该参数控制如何进行四舍五入: 链接中的示例: echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10 echo round(9.5, 0, PHP_ROUND_HALF_DO

在PHP中,如何将值22.04496取整为22.05?看来 四舍五入(22.04496,2)=22.04。是否应该是22.05


提前感谢

为什么应该是
22.05
?第三个小数点小于5,因此当您将其四舍五入到2个小数点时,它将被四舍五入到
22.04
PHP的round函数可以处理一个额外的参数,该参数控制如何进行四舍五入:

链接中的示例:

echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

您可以使用ceil并用10的幂进行乘除

echo ceil( 1.012345 * 1000)/1000;

1.013

不要在天花板、地板或圆形函数内进行乘法运算!您将得到浮点错误,并且它可能非常不可预测。要避免这种情况,请执行以下操作:

function ceiling($value, $precision = 0) {
    $offset = 0.5;
    if ($precision !== 0)
        $offset /= pow(10, $precision);
    $final = round($value + $offset, $precision, PHP_ROUND_HALF_DOWN);
    return ($final == -0 ? 0 : $final);
}
例如
天花板(2.2200001,2)
将给出
2.23

根据评论,我还添加了楼层功能,因为这有类似的问题:

function flooring($value, $precision = 0) {
    $offset = -0.5;
    if ($precision !== 0)
        $offset /= pow(10, $precision);
    $final = round($value + $offset, $precision, PHP_ROUND_HALF_UP);
    return ($final == -0 ? 0 : $final);
}
我认为最好的办法是:

echo ceil(round($value * 100)) / 100;
例如:

$value = 77.4;
echo ceil($value * 100) / 100; // 77.41 - WRONG!
echo ceil(round($value * 100)) / 100; // 77.4 - OK!

它只考虑
4
之后的数字(也是
4
),然后
22.04
是正确的。它不是先从96四舍五入到100,然后再从45四舍五入到50。
它不应该是22.05吗?
不是吗?044四舍五入到04,046四舍五入到05,按照设计22.04496更接近22.04而不是22.05。看看你自己:
22.04496-22.04=0.00496
但是
22.04496-22.05=-0.00504
这似乎是一个更适合的问题,基本上我需要通过这个函数得到js中给出的相同结果:函数roundNumber(num,dec){var result=Math.round(Math.round(num*Math.pow(10,dec+2))/Math.pow(10,2))/Math.pow(10,dec);返回结果;}注意,这确实需要PHP5.3这在这种情况下没有区别:
PHP>echo-round(22.04496,2,PHP-round-DOWN)
22.04
php>echo-round(22.04496,2,php-round-UP)
22.04
这比我的解决方案更优雅,我的解决方案只是在原始数字上加上.05,仍然使用舍入法,即舍入法(#.#####+0.05,2),所以1.012345舍入到1.013?怎样?1.012345 1.01235 1.0124此方法有缺陷:
ceil(77.4*100)/100===77.41
。为什么这是一个答案?最后!谢谢你正确地执行了这个功能。给这个人一枚奖章。一整天都在寻找一种不会被奇怪的浮点运算破坏的解决方案。只需稍加修改,就可以很好地精确地查找floor()。谢谢谢谢@LorienBrune我也添加了我的楼层功能。