iliaa Mon Nov 17 21:50:42 2003 EDT Added files: /php-src/ext/standard/tests/math bug25694.phpt
Modified files: /php-src/ext/standard math.c Log: Fixed Bug #25694 (round() and number_format() give inconsistent results). Index: php-src/ext/standard/math.c diff -u php-src/ext/standard/math.c:1.108 php-src/ext/standard/math.c:1.109 --- php-src/ext/standard/math.c:1.108 Sun Oct 5 04:08:49 2003 +++ php-src/ext/standard/math.c Mon Nov 17 21:50:40 2003 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: math.c,v 1.108 2003/10/05 08:08:49 zeev Exp $ */ +/* $Id: math.c,v 1.109 2003/11/18 02:50:40 iliaa Exp $ */ #include "php.h" #include "php_math.h" @@ -40,6 +40,18 @@ # endif #endif +#define PHP_ROUND_WITH_FUZZ(val, places) { \ + double tmp_val=val, f = pow(10.0, (double) places); \ + tmp_val *= f; \ + if (tmp_val >= 0.0) { \ + tmp_val = floor(tmp_val + PHP_ROUND_FUZZ); \ + } else { \ + tmp_val = ceil(tmp_val - PHP_ROUND_FUZZ); \ + } \ + tmp_val /= f; \ + val = !zend_isnan(tmp_val) ? tmp_val : val; \ +} \ + /* {{{ proto int abs(int number) Return the absolute value of the number */ @@ -121,7 +133,7 @@ { zval **value, **precision; int places = 0; - double f, return_val; + double return_val; if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 || zend_get_parameters_ex(ZEND_NUM_ARGS(), &value, &precision) == FAILURE) { @@ -147,14 +159,7 @@ return_val = (Z_TYPE_PP(value) == IS_LONG) ? (double)Z_LVAL_PP(value) : Z_DVAL_PP(value); - f = pow(10.0, (double) places); - - return_val *= f; - if (return_val >= 0.0) - return_val = floor(return_val + PHP_ROUND_FUZZ); - else - return_val = ceil(return_val - PHP_ROUND_FUZZ); - return_val /= f; + PHP_ROUND_WITH_FUZZ(return_val, places); RETURN_DOUBLE(return_val); break; @@ -995,13 +1000,15 @@ int tmplen, reslen=0; int count=0; int is_negative=0; - + if (d < 0) { is_negative = 1; d = -d; } dec = MAX(0, dec); + PHP_ROUND_WITH_FUZZ(d, dec); + tmplen = spprintf(&tmpbuf, 0, "%.*f", dec, d); if (tmpbuf == NULL || !isdigit((int)tmpbuf[0])) { Index: php-src/ext/standard/tests/math/bug25694.phpt +++ php-src/ext/standard/tests/math/bug25694.phpt --TEST-- Bug #25694 (round() and number_format() inconsistency) --FILE-- <?php echo "round 0.045 = " . round(0.045, 2) . "\n"; echo "number format 0.045 = " . number_format(0.045, 2) . "\n\n"; echo "round 0.055 = " . round(0.055, 2) . "\n"; echo "number format 0.055 = " . number_format(0.055, 2) . "\n\n"; echo "round 5.045 = " . round(5.045, 2) . "\n"; echo "number format 5.045 = " . number_format(5.045, 2) . "\n\n"; echo "round 5.055 = " . round(5.055, 2) . "\n"; echo "number format 5.055 = " . number_format(5.055, 2) . "\n\n"; echo "round 3.025 = " . round(3.025, 2) . "\n"; echo "number format 3.025 = " . number_format(3.025, 2) . "\n\n"; echo "round 4.025 = " . round(4.025, 2) . "\n"; echo "number format 4.025 = " . number_format(4.025, 2) . "\n\n"; ?> --EXPECT-- round 0.045 = 0.05 number format 0.045 = 0.05 round 0.055 = 0.06 number format 0.055 = 0.06 round 5.045 = 5.05 number format 5.045 = 5.05 round 5.055 = 5.06 number format 5.055 = 5.06 round 3.025 = 3.03 number format 3.025 = 3.03 round 4.025 = 4.03 number format 4.025 = 4.03 -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php