Как вычислить проценты суммы вложенных массивов так, чтобы их сумма была строго 100, используя C# decimal


Предположим, у меня есть массив целых чисел. Давайте логически разделим его всего на две части для упрощения.

Пусть total sum всех элементов массива-это 2860800.

Пусть сумма всех элементов left half равна 2834387. Пусть сумма всех элементов right half равна 26413.

Теперь вычисление процента левой половины по 100m * leftHalfSum / totalSum дает 99.07672678970917225950782998.

Точно так же процент правой половины от 100m * rightHalfSum / totalSum равен 0.9232732102908277404921700224.

Теперь, если я добавлю эти два процента в Часы Visual Studio, они показывают мне 100. Но если я добавлю их в приложение Calculator в Windows, это даст мне 100.0000000000000000000000000024, что правильно.

В принципе, я хочу, чтобы 100-leftHalfPercentage было строго равно rightHalfPercentage и наоборот. Если я делаю 100-leftHalfPercentage в дозоре, он дает мне 0.92327321029082774049217002. Обратите внимание, что он точно такой же, как rightHalfPercentage, но последние две цифры 24 отсутствуют.

Спасибо.

2 4

2 ответа:

Числа, которые вы вычислили, являются правильными, то есть они представляют свои проценты с одинаковой степенью точности.

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

Например, имея три равные группы, вычисленные с одним десятичным числом, вы получите 33.3% для каждой, что даст вам сумму 99.9%. Делать сумму 100% вы пожертвуете правильностью для одной группы и вычислите ее как 100 - 33.3 - 33.3 = 33.4.

Десятичные дроби имеют максимальную точность 28-29 значащих цифр (Источник ). Полный результат ваших вычислений будет состоять из 30 цифр, что очень много для десятичной системы счисления! Вот почему последние две цифры опущены.

Если ваш результат будет больше (например, общая сумма 10.000 вместо 100), то будет пропущено еще больше цифр.

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