Как бороться с суммой округленных процентов, не равной 100? - PullRequest
25 голосов
/ 08 марта 2011

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

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

Ответы [ 4 ]

27 голосов
/ 08 марта 2011

Вы можете обратиться к методу наибольшего остатка, используемому на выборах: Википедия: Метод наибольшего остатка

В вашем случае у вас есть

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
12 голосов
/ 08 марта 2011

Вариант 1

Если вы обеспокоены тем, что результаты выглядят немного странно для пользователя, я бы добавил сноску в отношении результатов, указав, что проценты были округлены, а мой показатель не равен 100%. Вы можете программно отобразить сообщение только тогда, когда округление вызывает такое поведение.

USA percentage:       43
Australia percentage: 29
Germany percentage:   29

*Percentages may not total 100 due to rounding

Вариант 2

Поскольку вы используете Ruby, я бы предложил использовать рациональных чисел. Таким образом, вы не теряете точность при необходимости. Вместо сноски вы можете отобразить процент с рациональными числами рядом с ним следующим образом:

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.

4 голосов
/ 20 марта 2012

Компоненты могут не суммироваться с итогами из-за округления.Стандарт в статистических отчетах.

Читы вернутся, чтобы укусить вас в следующую таблицу, отчет или приложениеВы не можете отслеживать изменения.Это выглядит смешно только для людей, которые не читают подобные отчеты.

О да.Это не ошибка округления.

3 голосов
/ 08 марта 2011

Вы можете немного «обмануть», суммируя все округленные результаты, кроме последнего, и задав последнему значение 100 - предыдущую сумму ...

В этом случае вы получите:

USA = 43
Aus = 29
Ger = 28  (100 - (43 + 29))

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

...