> On Mon, 24 Mar 2008 13:10:17 -0600, [EMAIL PROTECTED] wrote:

> > Beware: round() apparently has changed its behavior from PHP 4. For
> > certain special numbers that seem to be multiples of 100,000, the 
return
> > value is in exponential format, rather than the usual decimal format.
> Some
> > of these special values are 1200000, 1400000, 2300000, which are 
returned
> > as 1.2E+6, 1.4E+6, etc. You can generate your own list of these 
special
> > numbers using this code:
> > 
> > <?php
> > for( $tmp = 0, $i = 0; $i < 100; $i++ ) {
> >     $tmp += 100000;
> >     echo round($tmp),"\n";
> > }
> > ?>

I now have a list of 3 ways this change in behavior can bite you and 
result in a failed transaction. In the examples below, assume that the 
value passed to round() is '1200000', so that the value returned from 
round() is '1.2E+6'.

1. When interpolating the value into xml, resulting in an xsd validation 
error:

<?
$xml = '<AnnualIncome>' . round($income) . '</AnnualIncome>';
?>

2. When validating user input, resulting in a false positive:

<?
if(!ereg("^[0-9]{1,10}$", round($_POST['income']))) {
  $errors .= "<li>Income should be whole dollars only (10 digits 
max).</li>";
}
?>

3. When interpolating a value into a stored procedure call, resulting in a 
type mismatch between the value passed in and the database column data 
type (which is likely decimal for a monetary value):

<?
 $sql = "exec update_loan_financials
           @application_id='$appID',
           @total_debt=" . round($totalDebt);
?>

BTW, a previous poster pointed out that this is a change in behavior of 
the float type, in general, not of the round() function, in particular.

If you care.

I don't. I just know I have broken code to fix and customers to apologize 
to.

Kirk

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

Reply via email to