Как вычислить проценты суммы вложенных массивов так, чтобы их сумма была строго 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 ответа:
Числа, которые вы вычислили, являются правильными, то есть они представляют свои проценты с одинаковой степенью точности.
Если вы хотите, чтобы их сумма была ровно 100, то вам нужно выбрать одно из значений, чтобы быть менее точным. Значение, которое вы решите пожертвовать, будет просто вычислено путем вычитания всех остальных значений из 100.
Например, имея три равные группы, вычисленные с одним десятичным числом, вы получите33.3%
для каждой, что даст вам сумму99.9%
. Делать сумму100%
вы пожертвуете правильностью для одной группы и вычислите ее как100 - 33.3 - 33.3 = 33.4
.
Десятичные дроби имеют максимальную точность 28-29 значащих цифр (Источник ). Полный результат ваших вычислений будет состоять из 30 цифр, что очень много для десятичной системы счисления! Вот почему последние две цифры опущены.
Если ваш результат будет больше (например, общая сумма 10.000 вместо 100), то будет пропущено еще больше цифр.
Разница, вероятно, вызвана чем-то внутренним и, вероятно, потребуется некоторая проверка скомпилированного кода кем-то еще. знающий больше меня.