Доброго времени суток.
Язык разработки: PHP4
Данный вопрос скорее к математикам, нежели программистам.
Недавно я долго размышлял на тему написания вышеуказанной программы. В принципе все просто, гениально просто. Но так уж сложилось, что все в нашем мире происходит немного иначе, чем хочется, и с математикой и меня не на 5.
В чем проблема?
При построении графиков отображающих результаты голосования в процентах я получаю величины с большим к-вом знаков после запятой, например (32,34232233). Когда я пытаюсь округлить, допустим, при помощи функц. round(), ceil(), floor, то сумма всех рейтингов не составляет 100%, а получается больше или меньше?
Например:
1. 33.3333333%
2. 33.3333333%
3. 33.3333333%
Округляем, используем round();
1. 33%
2. 33%
3. 33%
= 99%
Как выйти из этой ситуации, я не знаю. Подходящей информации не нашел.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
А в чем вопрос не понятно…
Тебе что нужно чтоб сумма после округления была 100, тогда вопрос «А зачем?».
Дык! :-) А чего ты ожидал? Округляя, ты заменяешь числа в сумме другими числами, — ну и сумма становится другой. Если все округления — в сторону уменьшения, то и сумма становится меньше. А если все округлять в меньшую сторону, а последнее число, скажем, — в большую, то нарушится пропорциональное соотношение чисел. Так что, никуда не денешься. Можно, впрочем, держать меньше чисел после запятой — кто их складывать-то будет. :-) (и если говорить о математике, то и твои исходные числа в сумме дают 99.9999999, что не есть 100)
Типа (не помню, как это на PHP, а на С++ так):
double x = 1.234567890;
x = int(x * 100)/100.0;
сохранит тебе 2 знака после запятой (т.е. теперь x = 1.23)
Good Luck,
UT
To: iliya
Окончательная сумма в 100% нужна для достоверности результатов.
Представь: два ответа.
1. 45%
2. 54%
Пользователь подумает, а где остальные процент(ы)?
To: UT
На сколько я понимаю для реализации того, что я хочу прийдется нарушать «нормальную» пропорциональность чисел. Мне просто очень интересно как это реализованно в уже написенный тестах?
Я предполагаю сделать так:
1. Подсчет процентного соотношения все вариантов
2. Корректировка суммы значений путем корректировки значения варианты с самым большим к-вом голосов.
Такой вариант сработает, но возможно есть варианты лучше, эффективней.
Я бы хотел реализовать расчет с минимальной корректировкой.
Возможно лучше корректировать значения всех вариантов одновременно?
Все корректировать не получится, как очевидно из твоего же примера с 1/3 на каждый из трех показателей. В сущности, можно один показатель не высчитывать вообще, а отнимать от ста сумму всех остальных показателей. Типа
Где обедал воробей?
a) В зоопарке x%
b) У зверей y%
c) Другое (100 — x — y)%
Тогда сумма всегда будет 100. Хотя, если «синтетическое» поле — значимое, то может получиться конфуз
Пол Вашего ребенка
а) Мужской 1 голос 33%
б) Женский 1 голос 33%
в) Вырастет — само решит 1 голос 34%
В общем, так вот оно…
Good Luck,
UT
Спасибо UT за помощь.
Поздравляю nixp и все его учасников, а также Дмитрия Шурупова с наступающими новогодними праздниками.
Всем удачи и успешной реализации все своих планов. Пусть nixp станет еще лучше в новом году, потому как есть немного мест в интернете, где возможно получить ответ на вопрос и пообщаться с хорошими людьми.
Еще раз всех с новым годом. Guest aka Nuclear.