我通过使用以下方法遇到了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 。现在,如果有任何十进制输入,如何实现精确的十进制数。
答案 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