Forum Webscript.Ru

Программирование => PHP => Тема начата: Сергей Иванов от 12 Июля 2006, 07:45:41

Название: Автоматическое определение пипса списка чисел
Отправлено: Сергей Иванов от 12 Июля 2006, 07:45:41
Блин, уже второй день маюсь по поводу решения своей задачи - всё получаются какие-то кодо-монстры, которые и меня даже пугают.

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

примеры.
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 от 12 Июля 2006, 14:24:24
Может так? (Не слишком "красивое" решение - но работает)



$a1=array(1.0950, 1.0800, 1.1000, 1.0010);
$a2=array(500000, 1300000, 900000);
$a3=array(50000, 1.035, 10000000, 1.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)
{
$tmp= floatval($arr/10);
        if($tmp==floatval(intval($tmp)))
           {
            $arr=$tmp;
            $count++;
  }
else
  {
return pow(10, ($count-1));
  }
}
}

?>
Название: Автоматическое определение пипса списка чисел
Отправлено: Сергей Иванов от 12 Июля 2006, 16:51:53
у меня подобная бодяжка получилась. я думал может есть вариант, типа:
$rate=puper(min($ar));

:)
Anyway thanX for help, Man!
Название: Автоматическое определение пипса списка чисел
Отправлено: Сергей Иванов от 12 Июля 2006, 17:29:56
Специально для любителей японской кухни посвещается:

$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 от 13 Июля 2006, 09:38:47
Вот в этом месте не правильно работает твоя функция.


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


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

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

типа так:

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

 - тогда граффик точно не построишь.
Название: Автоматическое определение пипса списка чисел
Отправлено: Сергей Иванов от 13 Июля 2006, 17:22:51
Профессор, могу я пересдать?


$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==0 && isset($e[1]) && $mif($c && $m>strlen($e[0]))$m=-1*strlen($e[0]);
}
return $m;
}


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