Si los tres valores siempre tienen que resumir a continuación 100 ronda sólo dos de los valores y calcular el tercero con
third = 100 - Math.Round(a) - Math.Round(b);
Nota: Su resultado también podría ser demasiado pequeño. Si tiene tres valores siendo 33.333333, ¡al redondearlos y agregarlos obtendrá 99!
EDITAR (en respuesta al comentario de @ BlueRajaDannyPflughoeft)
Si usted tiene muchos valores, la suma de todos los errores de redondeo podría llegar a ser grande. Por lo tanto, no sería una buena idea cambiarlo al último valor. Para estos casos, sugiero un redondeo continuo.
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 }
No es perfecto, sin embargo, el error nunca debe exceder el 1%. Aquí hay otro ejemplo
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 }
Post. Tu. Código. – Oded
Bueno, ¿por qué no escribes la suma en una variable y compruebas que no supera el límite especificado? Alternativamente, podría forzar los valores a redondearse al entero más grande más pequeño que el valor real ... – Abrixas2