Edit report at https://bugs.php.net/bug.php?id=65637&edit=1
ID: 65637
User updated by: productivepc at hotmail dot com
Reported by: productivepc at hotmail dot com
Summary: Using division PHP_ROUND_HALF_UP rounds DOWN when
working with 2 precision
Status: Not a bug
Type: Bug
Package: Math related
Operating System: Windows 7
PHP Version: 5.5.3
Block user comment: N
Private report: N
New Comment:
Okay. Thanks for looking in to it. This can be closed.
Previous Comments:
------------------------------------------------------------------------
[2013-09-09 06:59:03] [email protected]
$additionalPcCostPerDay is either 3.33 (rounded to two) or 3.333 (rounded to
three). The actual value is ~3.3328. The rounding there is correct.
As for 0.05 drop, the difference "lost" using two decimal places is -0.003 * 16
=
-0.048 and you round that off to -0.05. So that's where it came from. It sounds
like you expect the rounding to carry from one number to the next? That's not
how
rounding works. That's why you always round at the very end of the set of
calculations.
------------------------------------------------------------------------
[2013-09-09 05:49:28] productivepc at hotmail dot com
I went ahead and wrote it before I went to bed. The only thing you have to
change is the 3 to a 2 in this line: $additionalPcCostPerDay =
round($additionalPcCost/$totalWorkingDays,3,PHP_ROUND_HALF_UP);
You will see the price go from 182.09 when it is looking at 3 decimal places to
182.04 when it is looking at 2 decimal places. When rounding up even if the
number previously was a 6 I would expect it to go to 182.10 and not drop $.05.
<?php
$workingDaysLeft = 16;
$totalWorkingDays = 21;
$mainPcCost = 169;
$additionalPcCost = 69.99;
$additionalpcs = 1;
$mainPcCostPerDay = $mainPcCost/$totalWorkingDays;
$additionalPcCostPerDay =
round($additionalPcCost/$totalWorkingDays,3,PHP_ROUND_HALF_UP);
$mainPcProratedCost = $mainPcCostPerDay*$workingDaysLeft;
$additionalPcProratedCost = $additionalPcCostPerDay*$workingDaysLeft;
$totalProratedCost =
number_format($mainPcProratedCost+$additionalPcProratedCost,2,'.',',');
$costPerFullMonth = $mainPcCost+($additionalpcs*$additionalPcCost);
// echo "<br>mainPcCost: " . $mainPcCost . "<br>additionalPcCost: " .
$additionalPcCost;
// echo "<br>additionalpcs: " . $additionalpcs;
// echo "<br>WorkingDaysLeft: " . $workingDaysLeft .
"<br>totalWorkingDays:
" . $totalWorkingDays;
// echo "<br>mainPcCostPerDay: " . $mainPcCostPerDay . "
<br>additionalPcCostPerDay: " . $additionalPcCostPerDay;
// echo "<br>mainPcProratedCost: " . $mainPcProratedCost . "
<br>additionalPcProratedCost: " . $additionalPcProratedCost;
echo "<br>totalProratedCost: " . $totalProratedCost;// . "
<br>costPerFullMonth: " . $costPerFullMonth;
?>
------------------------------------------------------------------------
[2013-09-09 05:34:34] productivepc at hotmail dot com
In your example, you are rounding to 1 decimal place and yes absolutely that
will
throw it off however if you do =PRODUCT(ROUNDUP(1.45,2),1000) = 1450. I removed
all rounding except for the $additionalPcCostPerDay =
round($additionalPcCost/$totalWorkingDays,3,PHP_ROUND_HALF_UP); and the error
still happens. When I attempt to round to 2 decimal places the rounding
appears
to round down and not up. When I do it to 3 then it works as expected. It is
1:33am. I will write a smaller script tomorrow after I sleep and post it here.
------------------------------------------------------------------------
[2013-09-09 02:57:46] [email protected]
And by the way, you know that rounding numbers too early will throw off future
calculations, right? 1.45 * 1000 = 1450 but roundup(1.45, 1) * 1000 = 1500.
Don't
round until the very end.
------------------------------------------------------------------------
[2013-09-09 02:48:04] [email protected]
The script you've provided doesn't output the example numbers you gave. I get
additionalPcCostPerDay: 0.159 or 0.16
additionalPcProratedCost: 2.54 or 2.56
totalProratedCost: 131.34 or 131.36
Want to try the repro script again? Hopefully something a bit smaller with
fewer
variables?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=65637
--
Edit this bug report at https://bugs.php.net/bug.php?id=65637&edit=1