Как бороться с суммой округленного процента, не являющегося 100?
Предположим, что у нас есть список элементов с целым числом:
USA: 3 people
Australia: 2 people
Germany: 2 people
Если мы подсчитаем процент каждого значения по сумме по всему списку, получим:
USA: 3/(3+2+2)*100 = 42.857...%
Australia: 2/(3+2+2)*100 = 28.571...%
Germany: 2/(3+2+2)*100 = 28.571...%
и если мы округлим его, получим:
USA: 43%
Australia: 29%
Germany: 29%
Сумма 43 + 29 + 29 = 101 не равна 100, и это выглядит немного странно для пользователя программного обеспечения. Как бы вы решили эту проблему?
Ответы
Ответ 1
Вариант 1
Если вас беспокоит то, что результаты выглядят немного странно для пользователя, я бы поставил сноску относительно результатов, в которых упоминалось, что проценты округлены, а моя сумма не равна 100%. Вы можете программно отображать сообщение только тогда, когда округление вызывает это поведение.
USA percentage: 43
Australia percentage: 29
Germany percentage: 29
*Percentages may not total 100 due to rounding
Вариант 2
Поскольку вы используете Ruby, я бы предложил использовать rational номера. Таким образом, вы не теряете точность, когда это необходимо. Вместо сноски вы можете отображать процент с рациональными числами рядом с ним, как показано ниже:
USA percentage: 43 (3/7)
Australia percentage: 29 (2/7)
Germany percentage: 29 (2/7)
Вариант 3
Включите больше десятичных знаков, чтобы ошибка округления была менее серьезной:
USA percentage: 42.9
Australia percentage: 28.6
Germany percentage: 28.6
В результате получается 100.1 вместо 101.
Ответ 2
Вы можете ссылаться на метод наибольшего остатка, используемый в выборах: Википедия: самый большой метод останова
В вашем случае у вас есть
USA: 42.857...
Australia: 28.571...
Germany: 28.571...
Если вы берете целую часть, вы получаете
USA: 42
Australia: 28
Germany: 28
который добавляет до 98, и вы хотите взять еще два. Теперь вы смотрите на десятичные части, которые
USA: 0.857...
Australia: 0.571...
Germany: 0.571...
и возьмите самые крупные, пока общее количество не достигнет 100. Если вы возьмете США, общее количество составит 99, и вы хотите взять еще одно. Здесь возникает проблема. Поскольку вы остаетесь с галочкой 0,571... между Австралией и Германией, если вы возьмете оба, общее количество будет 101. Таким образом, у вас есть два способа выбора:
(a) Если вы сильно хотите, чтобы общее число составляло 100, просто возьмите Австралию и не принимайте больше:
USA: 43
Australia: 29
Germany: 28
(b) Если вы предпочитаете уважать тот факт, что Австралия и Германия находятся в галстуке, вы останавливаетесь в этом пункте:
USA: 43
Australia: 28
Germany: 28
Ответ 3
Компоненты не могут суммироваться до итогов из-за округления.
Стандарт в статистических отчетах.
Читы вернутся, чтобы укусить вас в следующей таблице, отчете или приложении. Вы не можете отслеживать изменения. Это выглядит забавно только для людей, которые не читают подобные отчеты.
О да. Это не ошибка округления.
Ответ 4
Вы можете "обмануть" бит, суммируя все округленные результаты, но последним и давая последнему значение 100 - предыдущую сумму...
В этом случае у вас будет:
USA = 43
Aus = 29
Ger = 28 (100 - (43 + 29))
Но это всего лишь грязный трюк... Вам лучше следовать более честное/точное решение, данное Мэттом, поскольку мой, по-видимому, указывает, что процент Германии меньше, чем австралийский.