Как бороться с суммой округленного процента, не являющегося 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%

Вопрос:

Предположим, что у нас есть список элементов с целым числом:

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
  2. Вариант 2
  3. Вариант 3

Вариант 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))

Но это всего лишь грязный трюк… Вам лучше следовать более честное/точное решение, данное Мэттом, поскольку мой, по-видимому, указывает, что процент Германии меньше, чем австралийский.

Оцените статью
Добавить комментарий