Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод результатов опроса в процентном эквиваленте.
 
 автор: provodnik   (25.03.2007 в 03:46)   письмо автору
 
 

Сбился с ног. перепробовал round(), ceil(), floor()...
Ничего "путёвого" добиться не могу.
А желаемое очень с виду несложно: допустим 4 варианта ответа на опрос.
Что бы выводилось 100%, если голосуют за один какой либо вариант...
Что бы выводилось ровно 100%, если сложить проценты всех ответов...

В phpbb нашел это:

<?
'POLL_OPTION_PERCENT' => sprintf("%.1d%%", ($vote_percent 100)),
?>

Думаю это - то что мне нуно, но разобраться в одиночестве не могу...

Господа - как у вас организована выдача результатов опросов и голосований в процентном эквиваленте?

Заранее благодарен за высказвания..

   
 
 автор: moonfox   (25.03.2007 в 04:06)   письмо автору
 
   для: provodnik   (25.03.2007 в 03:46)
 

чистая математика
сумма всех = 100 %
===================
всего ответов 12 = 100 %

1 ответ - 1 = 1*100/12=8.33%
2 ответ - 5 = 5*100/12=41.67%
3 ответ - 5 = 5*100/12=41.67%
4 ответ - 1 = 1*100/12=8.33%
============================
итого 100%

1 ответ - 1 = 12*100/12=100%
2 ответ - 0
3 ответ - 0
4 ответ - 0
============================
итого 100%

ЗЫ результаты можно округлять.

   
 
 автор: provodnik   (25.03.2007 в 12:42)   письмо автору
 
   для: moonfox   (25.03.2007 в 04:06)
 

:), у меня на бумаге, в теории тоже очень всё хорошо получилось.... А на деле нет..

<?
$procent 
100 $sum['sum_answer']; //1 процент = 100 / сумму значений столбца
$procent round($procent);   // округляем до целого
$a =  $message['answer'] * $procent//вычисляем колво процентов одного из ответов
?>

Так вот эта дрянь, если из ТРЕХ вопросов ответили на какой либо ОДИН - ТРИ раза, то количество процентов у этого ответа будет 99%.
Дальше - интереснее: если из ТРЕХ вопросов ответили на какой либо ОДИН - ШЕСТЬ раз, то количество процентов у этого ответа будет 102%.
если из ТРЕХ вопросов ответили на какой либо ОДИН - ШЕСТЬ раз и на второй вопрос ответили ОДИН раз, то количество процентов у первого ответа будет 84%, а у второго 14%.. Что в сумме ну никак не составить 100%...

Прошу совета, господа..

   
 
 автор: moonfox   (25.03.2007 в 21:53)   письмо автору
 
   для: provodnik   (25.03.2007 в 12:42)
 

так и непонял в чем проблема:?
вот все работает


<form name="form1" method="post" action="">
  <input name="a" type="text" id="a">
  <input name="b" type="text" id="b">
  <input name="c" type="text" id="c">
  <input type="submit" name="Submit" value="Submit">
</form>

<?
$a
=$_POST['a'];
$b=$_POST['b'];
$c=$_POST['c'];
$total=$a+$b+$c;

if(
$a || $b || $c)
{
echo 
round($otvet1=$a*100/$total)."<br>";
echo 
round($otvet2=$b*100/$total)."<br>";
echo 
round($otvet3=$c*100/$total)."<br>";
}
echo 
"<br><br>";
echo 
"всего: ";
echo 
round ($otvet3+$otvet1+$otvet2);


?>


вы видимо считаете .. не той стороной :D
математика однако!

   
 
 автор: provodnik   (25.03.2007 в 23:59)   письмо автору
 
   для: moonfox   (25.03.2007 в 21:53)
 

Вот мой код:

<?
$query 
mysql_query("SELECT SUM(answer) AS sum_answer FROM poll"); //достаем из базы сумму всех голосов 
$sum mysql_fetch_array($query);

$query mysql_query("SELECT * FROM poll"); // достаем варианты ответа и количество голосов за этот вариант
while($message mysql_fetch_array($query))
{    
    echo 
$message['variant']; // выводим вариант ответа
    
echo ", голосов: ".$message['answer'].", "//выводим количество голосов за него
    
$q round($message['answer']*100/$sum['sum_answer']); //вычисляем округленный процент
    
echo $q."%<br />"//выводим процент
}
echo 
"<br />Всего голосов: ".$sum['sum_answer']; // выводим общее количество голосов
?>


При всего 6-ти голосах (3 голоса за первый вариант, 1 голос за второй вариант, 1 голос за третий вариант, 1 голос за 4-й вариант)
скрипт выводит 50%, 17%, 17%, 17% соответственно, что в сумме 101% !.
Дальше - ещё интереснее: если добавить 1 варианту 4-й голос, то выводится 57%, 14%, 14%, 14%, что в сумме 99%...
если добавить 1 варианту 5-й голос, то выводится 63%, 13%, 13%, 13%, а это в сумме 102%...
и так далее...
Так что тут помимо математики еще функции округления мозг компостируют...

   
 
 автор: moonfox   (26.03.2007 в 00:08)   письмо автору
 
   для: provodnik   (25.03.2007 в 23:59)
 

почему у меня пашет?!
мистика...

самое простое:

<?
mysql_connect
('localhost:3307','root','1224');
mysql_select_db('test');


$query mysql_query("SELECT * FROM poll where id='1'");
while(
$data mysql_fetch_array($query)) 
{
$i=1;
$total=$data['count1']+$data['count2']+$data['count3'];
echo  
"всего ответов: ".$total."<br><br>";

echo 
"вариант 1: ".$data['answer1']." ".round($data['count1']*100/$total)."%<br>";
echo 
"вариант 2: ".$data['answer2']." ".round($data['count2']*100/$total)."%<br>";
echo 
"вариант 3: ".$data['answer3']." ".round($data['count3']*100/$total)."%<br>";

echo 
"<br><br>";
echo 
"ИТОГО: ".round(($data['count1']*100/$total)+($data['count2']*100/$total)+($data['count3']*100/$total))."%";
}
?>


БД:



-- 
-- Структура таблицы `poll`
-- 

CREATE TABLE `poll` (
  `question` varchar(50) NOT NULL,
  `answer1` text NOT NULL,
  `count1` int(5) NOT NULL,
  `answer2` text NOT NULL,
  `count2` int(5) NOT NULL,
  `answer3` text NOT NULL,
  `count3` int(5) NOT NULL,
  `id` int(5) NOT NULL auto_increment,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;

-- 
-- Дамп данных таблицы `poll`
-- 

INSERT INTO `poll` (`question`, `answer1`, `count1`, `answer2`, `count2`, `answer3`, `count3`, `id`) VALUES 
('да или нет?', 'нет', 1, 'да', 0, 'незнаю', 0, 1);

   
 
 автор: provodnik   (26.03.2007 в 09:44)   письмо автору
 
   для: moonfox   (26.03.2007 в 00:08)
 

:), мда... интересно.. что-то я никак не уловлю суть...
А мой код пробовали?

моя БД:

-- 
-- Структура таблицы `poll`
-- 

CREATE TABLE `poll` (
  `id` int(1) NOT NULL auto_increment,
  `variant` varchar(64) NOT NULL default '',
  `answer` int(4) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

-- 
-- Дамп данных таблицы `poll`
-- 

INSERT INTO `poll` VALUES (1, 'Да', 9);
INSERT INTO `poll` VALUES (2, 'Нет', 3);
INSERT INTO `poll` VALUES (3, 'Не думал об этом', 1);
INSERT INTO `poll` VALUES (4, 'Неначто', 1);        

   
 
 автор: moonfox   (26.03.2007 в 23:16)   письмо автору
 
   для: provodnik   (26.03.2007 в 09:44)
 

однако... у меня все правельно работает:


<? 


mysql_connect
('localhost:3307','root','1224');
mysql_select_db('NN');

$query mysql_query("SELECT SUM(answer) AS sum_answer FROM poll"); //достаем из базы сумму всех голосов  
$sum mysql_fetch_array($query); 

$query mysql_query("SELECT * FROM poll"); // достаем варианты ответа и количество голосов за этот вариант 
while($message mysql_fetch_array($query)) 
{     
    echo 
$message['variant']; // выводим вариант ответа 
    
echo ", голосов: ".$message['answer'].", "//выводим количество голосов за него 
    
$q round($message['answer']*100/$sum['sum_answer']); //вычисляем округленный процент 
    
echo "-".$q."%<br />"//выводим процент 

echo 
"<br />Всего голосов: ".$sum['sum_answer']; // выводим общее количество голосов 

?> 
[code]


--
-- Структура таблицы `poll`
--

CREATE TABLE `poll` (
`id` int(1) NOT NULL auto_increment,
`variant` varchar(64) NOT NULL default '',
`answer` int(4) default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

--
-- Дамп данных таблицы `poll`
--

INSERT INTO `poll` (`id`, `variant`, `answer`) VALUES
(1, 'Да', 9),
(2, 'Нет', 0),
(3, 'Не думал об этом', 0),
(4, 'Неначто', 1);

[/code]
выдало результат

да, голосов: 9, -90%
нет, голосов: 0, -0%
Не думал об этом, голосов: 0, -0%
Неначто, голосов: 1, -10%

Всего голосов: 10 

   
 
 автор: provodnik   (27.03.2007 в 09:56)   письмо автору
 
   для: moonfox   (26.03.2007 в 23:16)
 

если у вас всё правильно работает в таких случаях:

цитирую: При всего 6-ти голосах (3 голоса за первый вариант, 1 голос за второй вариант, 1 голос за третий вариант, 1 голос за 4-й вариант)
скрипт выводит 50%, 17%, 17%, 17% соответственно, что в сумме 101% !.
Дальше - ещё интереснее: если добавить 1 варианту 4-й голос, то выводится 57%, 14%, 14%, 14%, что в сумме 99%...
если добавить 1 варианту 5-й голос, то выводится 63%, 13%, 13%, 13%, а это в сумме 102%...

то я не знаю, наверное, мне стоит переквалифицироваться в какие нибудь грузчики... :(

   
 
 автор: Trianon   (27.03.2007 в 10:12)   письмо автору
 
   для: provodnik   (27.03.2007 в 09:56)
 

Есть такая штука, как ошибка округления. Если Вы хотите видеть проценты целыми, то естественно, после суммирования ровно сотню Вы не получите.

   
 
 автор: KPETuH   (27.03.2007 в 10:46)   письмо автору
 
   для: provodnik   (27.03.2007 в 09:56)
 

Могу предложить такой вариант складывайте все кроме самого маленького вчитыйте из 100 сумму и получайте меньшее значение, в таком случай у вас всегда будет 100 по сумме и небольшая погрешность по меньшему

   
 
 автор: Trianon   (27.03.2007 в 10:49)   письмо автору
 
   для: KPETuH   (27.03.2007 в 10:46)
 

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

   
 
 автор: mindless   (27.03.2007 в 17:12)   письмо автору
 
   для: Trianon   (27.03.2007 в 10:49)
 

а вы не используйте функцию округления..
а просто показвйте 2 знака после запятой. тогда будет более менее

   
 
 автор: Trianon   (27.03.2007 в 18:08)   письмо автору
 
   для: mindless   (27.03.2007 в 17:12)
 

у меня как-то подобного рода проблем не возникает :)

   
 
 автор: provodnik   (20.08.2007 в 16:23)   письмо автору
 
   для: Trianon   (27.03.2007 в 18:08)
 

Как это не странно, но адекватного решения я так и не нашел...
Склоняюсь к совету г-на KPETuHа...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования