On Mon, 2008-07-14 at 12:39 -0500, Jay Blanchard wrote:
> I am totally buffaloed by a set of very simple calculations that I am
> doing;
> 
> /* calculate total balance with payments and adjustments */
>       $totalBalance = $acct['BALANCE'] + $adjBalance;
>       echo number_format($totalBalance, 2, '.', '')."\t";
>       
>       /* calculate total charges */
>       $totalCharges = $intlLDCharges + $longDistance + $smsCharges +
> $daCharges + $totalData + $roaming;
>       echo number_format($totalCharges, 2, '.', '')."\t";
>       
>       /* 
>        * calculate difference between total balance and total charges
>        * if the amount matches the ending balance then all is OK
>        * if not calculate the difference
>        */  
>       $totBalDiff = $totalBalance - $totalCharges;
>       if($totBalDiff === $endingBal){
>               echo "OK\t";
>       } else {
>               /* what is the difference between the ending balance and
> the charges? */
>               $totChargeDiff = $endingBal - $totalCharges;
>               echo number_format($totChargeDiff, 2, '.', '')."\t";
>       }
> 
> Each number represented by a variable in all of these calculations has
> been rounded to 2 decimal points at the point they are generated. For
> the most part this works just hunky-dory but I have a handful of calcs
> (out of 300k plus records) that look like this....
> 
> $endingBal            0.10
> $totalBalance 0.30    
> $totalCharges 0.20
> $totalChargeDiff      -0.10
> 
> The balance minus the charges does equal the ending balance as it should
> but it is saying that it doesn't and that there a 20 cent swing (-0.10
> is 20 cents different than 0.10).
> 
> I must be missing something. When I echo out raw data I do not see
> negative signs. Does anyone have any insight as to what might be
> happening here?       

>From whence do you conjure $endingBal?

Most likely this is just a floating point imprecision problem. In
otherwords, you need a small delta of error when doing the following
comparison:

    if( $totBalDiff === $endingBal )

Remember, floating point numbers do not always store perfectly. So you
want something like:

    if( abs( $totalBalDiff - $endingBal ) > .000001 )

Also that last echo:

    echo number_format($totChargeDiff, 2, '.', '')

Was calculated with:

    $totChargeDiff = $endingBal - $totalCharges;

Whereas the initial conditional checks:

    $totBalDiff === $endingBal

And $totBalDiff was calculated as:

    $totBalDiff = $totalBalance - $totalCharges;

So again... from whence do you conjure $endingBal? :)

Cheers,
Rob.
-- 
http://www.interjinn.com
Application and Templating Framework for PHP


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to