|
|
|
| Сбился с ног. перепробовал round(), ceil(), floor()...
Ничего "путёвого" добиться не могу.
А желаемое очень с виду несложно: допустим 4 варианта ответа на опрос.
Что бы выводилось 100%, если голосуют за один какой либо вариант...
Что бы выводилось ровно 100%, если сложить проценты всех ответов...
В phpbb нашел это:
<?
'POLL_OPTION_PERCENT' => sprintf("%.1d%%", ($vote_percent * 100)),
?>
|
Думаю это - то что мне нуно, но разобраться в одиночестве не могу...
Господа - как у вас организована выдача результатов опросов и голосований в процентном эквиваленте?
Заранее благодарен за высказвания.. | |
|
|
|
|
|
|
|
для: 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%
ЗЫ результаты можно округлять. | |
|
|
|
|
|
|
|
для: 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%...
Прошу совета, господа.. | |
|
|
|
|
|
|
|
для: 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
математика однако! | |
|
|
|
|
|
|
|
для: 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%...
и так далее...
Так что тут помимо математики еще функции округления мозг компостируют... | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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%...
то я не знаю, наверное, мне стоит переквалифицироваться в какие нибудь грузчики... :( | |
|
|
|
|
|
|
|
для: provodnik
(27.03.2007 в 09:56)
| | Есть такая штука, как ошибка округления. Если Вы хотите видеть проценты целыми, то естественно, после суммирования ровно сотню Вы не получите. | |
|
|
|
|
|
|
|
для: provodnik
(27.03.2007 в 09:56)
| | Могу предложить такой вариант складывайте все кроме самого маленького вчитыйте из 100 сумму и получайте меньшее значение, в таком случай у вас всегда будет 100 по сумме и небольшая погрешность по меньшему | |
|
|
|
|
|
|
|
для: KPETuH
(27.03.2007 в 10:46)
| | Вероятно, в этом случае относительная погрешность меньшего значения будет самой высокой из возможных. | |
|
|
|
|
|
|
|
для: Trianon
(27.03.2007 в 10:49)
| | а вы не используйте функцию округления..
а просто показвйте 2 знака после запятой. тогда будет более менее | |
|
|
|
|
|
|
|
для: mindless
(27.03.2007 в 17:12)
| | у меня как-то подобного рода проблем не возникает :) | |
|
|
|
|
|
|
|
для: Trianon
(27.03.2007 в 18:08)
| | Как это не странно, но адекватного решения я так и не нашел...
Склоняюсь к совету г-на KPETuHа... | |
|
|
|
|