Как бороться с суммой округленного процента, не являющегося 100? - программирование

Как бороться с суммой округленного процента, не являющегося 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, и это выглядит немного странно для пользователя программного обеспечения. Как бы вы решили эту проблему?

4b9b3361

Ответ 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))

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