Reunión de seguimiento, un panel en pantalla: incidencias por categoría, cinco trozos y la leyenda con su porcentaje al lado. Alguien los suma en voz alta: 34 + 28 + 19 + 12 + 8. Ciento uno.
Lo primero que piensas es que hay un dato mal contado. No lo había. Cada porcentaje estaba calculado y redondeado correctamente por separado, al entero más cercano, y ahí está el asunto: cinco redondeos independientes no tienen ninguna obligación de sumar cien. Cuatro de los cinco tiraban hacia arriba unas décimas. Cuatro décimas de nada y te sobra un punto entero.
El fallo no estaba en ningún porcentaje. Estaba en calcularlos cada uno a su aire.
Los arreglos que no lo son
- Poner un decimal. Ahora suma 100,1 y encima la leyenda ocupa más.
- Descontar la diferencia a la porción mayor. Funciona hasta que la diferencia son dos puntos y el 34 se convierte en un 32 que no es lo que vale nada.
- Truncar todo hacia abajo. Suma 96 y se ve peor todavía.
Reparto, no redondeo
Lo correcto es tratarlo como un problema de reparto: truncas todos los porcentajes, sumas, y la diferencia que falta hasta 100 son unos pocos puntos enteros que hay que entregar de uno en uno a las categorías con el resto decimal más alto. Es el método de los restos mayores, el mismo esqueleto con el que se reparten escaños. Veinte líneas.
La función fue lo rápido. Lo que costó de verdad fue la lista de casos raros, y ahí la IA local ayudó mucho más como abogado del diablo que como mecanógrafa:
- Total cero. Ni dividir, ni pintar cinco ceros: un guion y a otra cosa.
- La categoría con 1 de 3.000. Trunca a 0 y su resto es minúsculo, así que no le toca punto: la leyenda decía 0% de algo que existía. Se muestra «<1%» y ese trozo se saca del reparto.
- Empates en el resto. Dos categorías con exactamente ,5 y un solo punto que dar. Sin desempate explícito, el resultado depende del orden en que llegaron los datos, y el mismo panel se pinta distinto dos veces seguidas. Desempate estable: primero por valor absoluto, luego por nombre.
- Valores negativos (una categoría con anulaciones). El método no aplica, así que devuelve error en lugar de inventarse un reparto.
Y al final un test que no comprueba un ejemplo sino una propiedad: mil repartos generados al azar, con ceros, con empates y con listas de un solo elemento, y en todos suma exactamente 100 y ningún trozo con valor positivo aparece como 0%. Eso es lo que separa el «parece bien» del «está bien».
Por qué esto se escribió aquí
Los datos de prueba no eran inventados: eran los recuentos reales de un mes, con los nombres internos de las categorías de un cliente. Pegar eso en un chat es publicarlo, y no solo la tabla: el propio prompt ya cuenta que una categoría se lleva un tercio de las incidencias. Con el modelo corriendo en el navegador, sobre tu GPU, la conversación entera se queda en la pestaña y no hay nada que anonimizar antes de preguntar.
Abre Elffuss Code y escribe tu próxima utilidad con la IA dentro del navegador: ni el código ni los datos reales con los que lo pruebas salen de tu equipo.
Abrir Code →