Вопрос:
Предположим, что у нас есть список элементов с целым числом:
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
Если вас беспокоит то, что результаты выглядят немного странно для пользователя, я бы поставил сноску относительно результатов, в которых упоминалось, что проценты округлены, а моя сумма не равна 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.
Ответ №1
Вы можете ссылаться на метод наибольшего остатка, используемый в выборах: Википедия: самый большой метод останова
В вашем случае у вас есть
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 Ответ №2
Компоненты не могут суммироваться до итогов из-за округления.
Стандарт в статистических отчетах.
Читы вернутся, чтобы укусить вас в следующей таблице, отчете или приложении. Вы не можете отслеживать изменения. Это выглядит забавно только для людей, которые не читают подобные отчеты.
О да. Это не ошибка округления.
Ответ №3
Вы можете “обмануть” бит, суммируя все округленные результаты, но последним и давая последнему значение 100 – предыдущую сумму…
В этом случае у вас будет:
USA = 43 Aus = 29 Ger = 28 (100 — (43 + 29))
Но это всего лишь грязный трюк… Вам лучше следовать более честное/точное решение, данное Мэттом, поскольку мой, по-видимому, указывает, что процент Германии меньше, чем австралийский.