Автор Тема: Автоматическое определение пипса списка чисел  (Прочитано 4157 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Сергей Иванов

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://chubee.ru
Блин, уже второй день маюсь по поводу решения своей задачи - всё получаются какие-то кодо-монстры, которые и меня даже пугают.

В общем моему пхп-скрипту надо как-то распознать какой наименьший разряд числа используется в колонке чисел. Мне это надо, чтобы потом нарисовать на этой основе график - точка должна соответствовать этой минимальной цифре, минимальному разряду.

примеры.
1. если в колонке 1.0950, 1.0800, 1.1000, 1.0010 ... то минимальный разряд 0.001
2. если к волонке 500000, 1300000, 900000, ... то минимальный разряд 100000
3. если в колонке 50000, 1.035, 10000000, 1.05289, ... то минимальный разряд 0.00001 (хотя этот пример для любителей выращивателей апачи и IE - мегов до 600 можно вырастить запросто :).

Братва, если кто сталкивался с решением - подскажите на милость.

Оффлайн Egorsha

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Может так? (Не слишком "красивое" решение - но работает)


<?

$a1=array(1.09501.08001.10001.0010);
$a2=array(5000001300000900000);
$a3=array(500001.035100000001.05289);
echo 
FindMin($a1)."
"
;
echo 
FindMin($a2)."
"
;
echo 
FindMin($a3)."
"
;
//*** Выбор наименьшего из всех минимальных***
function FindMin($arr)
{
 
$min=FindMinNumber($arr[0]);
  foreach(
$arr as $k=>$v)
   {
 
	
$tmp=FindMinNumber($v);
 
	
if(
$tmp<$min$min=$tmp;
   }
 return 
$min;
}
	

//***Нахождение минимального разряда одного числа***
function FindMinNumber($arr)
{
  
$tmp=explode(".",$arr);
  if(isset(
$tmp[1]))
	
{
	
	
if(
intval($tmp[1])>0) return FindMinFract($tmp[1]);
	
}
	

  if(isset(
$tmp[0]))
    {
      if(
intval($tmp[0])>0) return FindMinInt($tmp[0]);
    }
  return 
false;
}
	

//***Минимальный разряд дробной части***
function FindMinFract($arr)
{
	
$tmp=(-1)*strlen($arr);
	
return 
pow(10$tmp);
}
//***Минимальный разряд целой части***
function FindMinInt($arr)
{
	
$count=1;
	
while(
1)
	
{
	
	
$tmpfloatval($arr/10);
	

        if(
$tmp==floatval(intval($tmp)))
           {
           
	
$arr=$tmp;
           
	
$count++;
	
	
   }
	
	
else
	
	
   {
	
	
	
return 
pow(10, ($count-1));
	
	
   }
	
}
	

}

?>

Оффлайн Сергей Иванов

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://chubee.ru
у меня подобная бодяжка получилась. я думал может есть вариант, типа:
$rate=puper(min($ar));

:)
Anyway thanX for help, Man!

Оффлайн Сергей Иванов

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://chubee.ru
Специально для любителей японской кухни посвещается:

$a1=array(1.0950, 1.0800, 1.1000, 1.0010);
$a2=array(500000, 1300000, 900000);
$a3=array(50000, 1.035, 10000000, 1.05289);
эхо(fract($a1), fract($a2), fract($a3));

function fract($a)
{
$t=explode(".",min($a));
if(isset($t[1]) && $t[1]>0)return strlen($t[1]);
if($t[0]>0)return -1*(strlen($t[0])-strlen(trim($t[0],"0")));
return 0;
}

Egorsha, thanks for help, again.

Оффлайн Egorsha

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вот в этом месте не правильно работает твоя функция.


...
$t=explode(".",min($a));
...


Хотя бы взять массив $a3,  число 1.035 - минимальное, а "минимальный разряд" у числа 1.05289.

А если у минимального числа вообще нет дробной части?

типа так:

$a1=array(1, 1.0950, 1.0800, 1.1000, 1.0010);

 - тогда граффик точно не построишь.

Оффлайн Сергей Иванов

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 24
  • +0/-0
  • 0
    • Просмотр профиля
    • http://chubee.ru
Профессор, могу я пересдать?


$a
=array("11.5""0""1005""105009");
echo 
fract($a);
function 
fract($a)
{
$m=$c=substr_count(implode("f",$a), ".")>0?0:500;
foreach(
$a as $v)
{
$e=explode("."$v);;
if(
$c==&& isset($e[1]) && $m<strlen($e[1]))$m=strlen($e[1]);
if(
$c && $m>strlen($e[0]))$m=-1*strlen($e[0]);
}
return 
$m;
}


PS. тот фракт тоже работает для данных, которые поставляются не в обрезанном виде. например котировки акций. но настоящие кодеры любители японской кухни (КЛЯКи :) обязаны писать код на все случаи мозговых порывов леммингов юзающих наш софт. А посему проверяйте, Профессор, зачётка у меня с собой, вернее рядом с именем. :)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28