Никаких танцев.
float round ( float val [, int precision] )
$a2- Это точность
$a = 1.01 нужна точность 2 знака после запятой , а по умолчанию 1.
Не нравится round(0,$a2) поставте 0 и флаг вам в руки.
Я уже писал про PHP и float выше.
Не забудте, что тип int всего 10 знаков.
$a = 1.00000000000001;
echo zzz($a,14)."\n";
The size of a float is platform-dependent, although a maximum of ~1.8e308 with a precision of roughly 14 decimal digits is a common value (that's 64 bit IEEE format).
function zzz($a1,$a2=1) {
$b = fmod($a1,1);
$c = $a1-$b;
$cnt=0;
$i=$b;
while (1==1) {
if ( fmod(round($i,$a2),1) == round(0,$a2) ) break;
$i *=10;
$i=round($i,$a2); // добавил сюда округление
echo $i."\n";
$cnt++;
}
$result= $c*pow(10,$cnt)+round($i,$a2);
return $result;
}
-~{}~ 23.08.05 10:01:
Сорри, тоже работает через раз.
Смотрю исходники PHP:
#ifndef PHP_ROUND_FUZZ
# ifndef PHP_WIN32
# define PHP_ROUND_FUZZ 0.50000000001
# else
# define PHP_ROUND_FUZZ 0.5
# 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 float round(float number [, int precision])
Returns the number rounded to specified precision */
PHP_FUNCTION(round)
{
zval **value, **precision;
int places = 0;
double return_val;
if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 ||
zend_get_parameters_ex(ZEND_NUM_ARGS(), &value, &precision) == FAILURE) {
WRONG_PARAM_COUNT;
}
if (ZEND_NUM_ARGS() == 2) {
convert_to_long_ex(precision);
places = (int) Z_LVAL_PP(precision);
}
convert_scalar_to_number_ex(value);
switch (Z_TYPE_PP(value)) {
case IS_LONG:
/* Simple case - long that doesn't need to be rounded. */
if (places >= 0) {
RETURN_DOUBLE((double) Z_LVAL_PP(value));
}
/* break omitted intentionally */
case IS_DOUBLE:
return_val = (Z_TYPE_PP(value) == IS_LONG) ?
(double)Z_LVAL_PP(value) : Z_DVAL_PP(value);
PHP_ROUND_WITH_FUZZ(return_val, places);
RETURN_DOUBLE(return_val);
break;
default:
RETURN_FALSE;
break;
}
}
-~{}~ 23.08.05 10:03:
файл \ext\standart\math.c
-~{}~ 23.08.05 10:12:
Всем кому интересна проблема с мат. операциями в PHP, сюда:
http://www.zend.com/lists/php-dev/200407/msg00651.html