Если три значения всегда должны суммироваться до 100, тогда округлите только два значения и вычислите третье с помощью
third = 100 - Math.Round(a) - Math.Round(b);
Примечание. Ваш результат также может быть слишком маленьким. Если у вас есть три значения 33,333333, округление и сложение их даст 99!
РЕДАКТИРОВАТЬ (в ответ на комментарий @ BlueRajaDannyPflughoeft)
Если у вас много значений, сумма всех ошибок округления может стать большой. Поэтому было бы не очень хорошей идеей перевести его на последнее значение. Для этих случаев я предлагаю непрерывное округление.
double[] values = new double[] { 17.2, 3.7, 4.6, 5.8 };
int[] percent = new int[values.Length];
double sum = values.Sum();
int totalPercent = 100;
for (int i = 0; i < values.Length; i++) {
double rawPercent = sum == 0 ? 0 : values[i] / sum * totalPercent;
sum -= values[i];
int roundedPercent = (int)Math.Round(rawPercent);
totalPercent -= roundedPercent;
percent[i] = roundedPercent;
}
// values = { 17.2, 3.7, 4.6, 5.8 }
//
// Percents:
// percent => { 55, 12, 15, 18 }
// raw (exact) => { 54.952, 11.821, 14.696, 18.530 } (rounded to 3 decimals)
// raw continuous => { 54.952, 11.809, 14.596, 18.000 }
Это не идеально, однако ошибка никогда не должна превышать 1%. Вот еще один пример
values = { 10.0, 10.0, 10.0, 10.0, 10.0, 10.0 }
Percents:
rounded => { 17, 17, 16, 17, 16, 17 }
raw (exact) => { 16.667, 16.667, 16.667, 16.667, 16.667, 16.667 }
raw continuous => { 16.667, 16.600, 16.500, 16.667, 16.500 17.000 }