El redondeo de los porcentajes de las encuestas es impreciso

Continuación del hilo El redondeo de porcentajes en las encuestas es inexacto:

Decidí crear un nuevo tema ya que el problema más reciente no se trata de reglas de redondeo cuestionables, sino de reglas completamente falsas. Por lo tanto, el tema debe estar en la categoría Contribute > Bug. No es un problema grave, pero de todas formas resulta algo incómodo.

Tuvimos una encuesta pública donde se emitieron 106 votos. Hubo 69 votos para “no” y 37 para “sí”. Una división simple da que 69/106 es aproximadamente 65,09 %. Sin embargo, el sistema indica que el 66 % votó por “no” y el 34 % por “sí”. Aquí hay una imagen:

El resultado final fue de 72 votos para “no” y 38 para “sí”, y la encuesta ahora está cerrada. 72/110 es aproximadamente 65,45 %, que el sistema también redondea al 66 %, por lo que puedes ver el error en acción en Tappara.co.

Intenté revisar el código para encontrar qué causa el error, pero no lo logré. Descubrí que se llama a una función llamada evenRound, pero cuando busqué su origen, no la encontré. Esto es solo una suposición, pero quizás esa función redondea el número al entero par más cercano?

Not sure I understand what’s broken here. The poll will round the % so they add up to 100%.

1 me gusta

El resultado es terrible, eso es lo que está roto. :slight_smile:

Gracias por el código. Simplemente no podía encontrarlo, lo que demuestra lo malo que soy usando GitHub. El código está extraído de Stack Overflow, donde su autor escribe:

No estoy seguro de qué nivel de precisión necesitas, pero lo que haría es simplemente sumar 1 a los primeros n números, siendo n la parte entera superior del total de decimales. En este caso, eso es 3, así que sumaría 1 a los primeros 3 elementos y redondearía hacia abajo el resto. Por supuesto, esto no es súper preciso, algunos números podrían redondearse hacia arriba o hacia abajo cuando no debería, pero funciona bien y siempre dará como resultado 100%.

No es de extrañar que con un método tan drástico obtengas resultados extraños. Sugiero que seamos un poco más elaborados. Este post en el mismo tema tiene 72 votos a favor, mientras que el post del que se extrae el código tiene solo 1.

Hay muchas formas de hacer esto, siempre que no te preocupes por depender de los datos decimales originales.

El primer método, y quizás el más popular, sería el Método de la Mayor Restante

Que básicamente consiste en:

  1. Redondear todo hacia abajo
  1. Obtener la diferencia entre la suma y 100
  1. Distribuir la diferencia sumando 1 a los elementos en orden decreciente de sus partes decimales

Creo que este método sería la mejor opción. Sigue siendo muy simple y da resultados mucho mejores. El código actual necesita unas pocas líneas más para indicarle a la función qué números deben redondearse hacia arriba. Sin embargo, hay otro problema a considerar. De este post en el mismo tema:

La respuesta muy votada de Varun Vohra minimiza la suma de los errores absolutos, y es muy simple de implementar. Sin embargo, hay casos límite que no maneja: ¿cuál debería ser el resultado de redondear 24.25, 23.25, 27.25, 25.25? Uno de esos necesita redondearse hacia arriba en lugar de hacia abajo.

El post sugiere varios métodos para elegir cuál se redondea hacia arriba y cuál hacia abajo, pero nunca se pueden evitar completamente las elecciones arbitrarias. Si quieres buscar la perfección, podrías leer ese post más a fondo, pero yo estaría satisfecho con esto también en estos casos especiales raros.

Probablemente solo elegirías arbitrariamente el primero o el último de la lista.

Espero que esto ayude. Mis habilidades probablemente serían suficientes para hacer las mejoras yo mismo si primero estudiara algo de sintaxis básica. No voy a hacerlo ahora mismo, pero quizás en algún momento si alguien no lo revisa antes.

Edición. Mejoré un poco el título cambiando la palabra “roto” por “impreciso”. Este tema también debería moverse a Contribute > Feature o fusionarse con el tema anterior.

4 Me gusta

Feel free to submit a pull request to change the rounding algorithm :wink:

5 Me gusta

It was like classic exercises for beginning programmers. Here is a way to do it, but someone who has more experience and isn’t totally new to JavaScript might find some shortcuts.

https://github.com/rizka10/discourse/pull/1/files

2 Me gusta

Looks fine to me. Would you mind making it a PR so that I can merge it?

I thought that was a pull request already… I’m as confused as always with Github. :confused:
I clicked some more green buttons now, maybe it does the trick?

If you want to create a PR from your code, you should go there: https://github.com/discourse/discourse/compare/master...rizka10:master :wink:

1 me gusta

I think I’m getting it now. I ran into some Github tutorials online yesterday and I should really go through one to learn the basics.

1 me gusta

Awesome. Before we can merge the code, we’ll need you to sign the CLA. I promise, this is the last step (also, you only have to sign it once ;))

6 Me gusta

Thanks for all the help! I signed it now.

4 Me gusta