将十进制值向上舍入到精确整数值php

时间:2016-09-27 05:27:19

标签: php rounding

我通过使用以下方法遇到了PHP舍入小数值:
round()函数舍入浮点数。
要将数字 UP 舍入到最接近的整数,请查看 ceil()函数。
要将数字 DOWN 舍入到最接近的整数,请查看 floor()函数。

我有一个划分1000/13的例子,当我们使用时 round(1000 / 13,2)会给你999.98然后我会用 ceil 将它四舍五入到1000.
现在,我的值是925.6,必须除以11,我尝试使用回合(925.6 / 11,2),这将得到84.15,然后如果你将它乘以11( 84.15 * 11)那么你将得到 925.56 。现在,如果有任何十进制输入,如何实现精确的十进制数。

1 个答案:

答案 0 :(得分:1)

  

使用round()ceil()floor()舍入Double或Float都有一个共同点,那就是:通过使用它们,您订阅了丢失精度的你数据。这意味着;一旦骰子被施放,你就无法再获得原始价值......就这么简单:

如果要同时保留截断值和原始值,则必须以不同方式执行....您可能需要保留2个变量或者只需将变量放入数组中。一个简单的例子可以更好地证明这一点:

<?php

        $num        = (925.6/11);

        // STORE THE ORIGINAL & ROUNDED VALUES IN AN ARRAY (IN CASE YOU NEED BOTH)
        $arrNumbers = [
                'original'  =>  $num,
                'rounded'   =>  round($num, 2),
        ];

        // NOW; FOR YOUR MULTIPLICATIONS:
        $original   = $arrNumbers['original'] * 11;
        $broken     = $arrNumbers['rounded']  * 11;


        var_dump($original);    //<== float 925.6
        var_dump($broken);      //<== float 925.65    :: ADDED AN EXTRA 0.05 (BOGUS, HUH?)
        var_dump($arrNumbers);  //<== array (size=2) 'original' => float 84.1454545455  'rounded' => float 84.15

UPDATE:NUMERATOR作为FORM-FIELD的值。

     <?php

        // ASSUME THE VALUE OF THE NUMERATOR IS: 925.6
        $numerator      = htmlspecialchars(trim($_POST['some_field'])); 

        // AND THE DENOMINATOR IS NOW SOMETHING LIKE MONTH 11 AS IN: 11.0000
        $denominator    = 11.0000;                                           

        // NO PROBLEMS STILL...
        $num            = ($numerator/$denominator);

        // STORE THE ORIGINAL & ROUNDED VALUES IN AN ARRAY (IN CASE YOU NEED BOTH)
        $arrNumbers     = [
                'original'  =>  $num,
                'rounded'   =>  round($num, 2),
        ];

        // NOW; FOR YOUR MULTIPLICATION,
        // TO GET THE STARTING VALUES BACK DO:
        $original       = $arrNumbers['original'] * 11;
        $broken         = $arrNumbers['rounded']  * 11;


        var_dump($original);    //<== float 925.6
        var_dump($broken);      //<== float 925.65    :: ADDED AN EXTRA 0.05 (BOGUS, HUH?)
        var_dump($arrNumbers);  //<== array (size=2) 'original' => float 84.1454545455  'rounded' => float 84.15