• Publicidad

Redondeo en Encuesta

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Redondeo en Encuesta

Notapor bAsTeR » 2010-10-14 12:23 @558

Hola, ¡qué tal, amigos perleros!

Fíjense que tengo un cliente al que se le desarrolló un proyecto complejo. Entre ellos, una encuesta.

La encuesta te muestra el porcentaje de cada respuesta, yo obtengo ese porcentaje por medio de la función ROUND() de MySQL.

Resulta que la suma de estos porcentajes no siempre te da 100%, es decir, a veces puedes tener 99% o en otras ocasiones 101%, para el cliente dice que es importante que ese porcentaje sume 100% en total.

Alguna sugerencia de cómo lograr que el porcentaje me dé siempre 100%.
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Publicidad

Re: Redondeo en Encuesta

Notapor explorer » 2010-10-14 13:39 @610

No redondees la cifra con el ROUND. Lee las cifras desde la base de datos tal cual son.

Luego, sigue un trabajo de asignación del valor 100 según el peso de los porcentajes leídos. Es decir, que si tengo un porcentaje de 92%, le asignaré un 92%. El problema es si hay un porcentaje como 8,53%. O 34,43%

Si supiéramos que todos los valores son mayores que 0, puedes usar un módulo como Math::Round::Fair, que hará el cálculo por ti. En el caso de tener valores 0, vale con sacarles fuera del reparto.

Ejemplo. Tenemos estos valores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
5,53
12,35
42,4
22,21
12,12
3,01
0,21
2,18
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que suman 100,01.

Se lo pasamos al módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use Math::Round::Fair 'round_fair';
  4.  
  5. my $total = 100;
  6. my @valores = qw(
  7.      5.53
  8.     12.35
  9.     42.4
  10.     22.21
  11.     12.12
  12.      3.01
  13.      0.21
  14.      2.18
  15. );
  16.  
  17. my @disposicion = round_fair($total, @valores);
  18.  
  19. print "@disposicion\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
y la salida es alguna de estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
5 12 42 23 12 3 1 2
5 12 43 22 12 3 0 3
5 12 43 22 12 4 0 2
5 12 43 22 13 2 1 2
5 12 43 22 13 3 0 2
5 12 43 22 13 3 1 1
5 13 42 22 12 3 0 3
5 13 42 23 12 3 0 2
6 12 42 22 12 3 0 3
6 12 42 22 13 3 0 2
6 12 43 21 13 3 0 2
6 12 43 22 12 3 0 2
6 12 43 22 12 3 1 1
6 13 41 22 12 4 0 2
6 13 41 23 12 3 0 2
6 13 42 22 11 3 0 3
6 13 42 22 12 2 0 3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
en la que todas, suman 100.

Bueno... es un poco raro, ya que el 42,4 a veces pasa a 43 y otras a 41... :( Quizás te vale esta solución, mientras no se entere el cliente que estás usando la función rand() para repartir los decimales que quedan sueltos.

Otro intento. Si multiplicamos todos los valores del 100 (el objetivo pasa a ser 10000), obtenemos valores mucho más ajustados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
553 1234 4240 2221 1212 301 21 218
553 1235 4239 2221 1212 301 21 218
553 1235 4240 2220 1212 301 21 218
553 1235 4240 2221 1211 301 21 218
553 1235 4240 2221 1212 300 21 218
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
pero... nos sigue quedando el trabajo del redondeo... vamos mal...

¿Alguna idea más?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Redondeo en Encuesta

Notapor bAsTeR » 2010-10-14 13:54 @621

Me parece perfecto el usar el módulo Math::Round::Fair. De igual manera el cliente lo que busca es mostrar que los resultados suman 100%, así que no creo que importen unos cuantos decimales repartidos aleatoriamente.

Muchas gracias, explorer.

P.D.: ¿Cómo haces para encontrar tan rápido el módulo necesario? ¿Te los aprendes de memoria? ¿O es experiencia?
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Re: Redondeo en Encuesta

Notapor explorer » 2010-10-14 14:17 @637

bAsTeR escribiste:¿Cómo haces para encontrar tan rápido el módulo necesario? ¿Te los aprendes de memoria? ¿O es experiencia?

Un poco de todo...

* Experiencia: saber qué palabra (en ingleś) se debe buscar en el motor de búsqueda de CPAN ;)

* Tengo el RSS de search.cpan.org, por lo que, muy de vez en cuando, veo la lista de los módulos más recientes y, cuando veo un módulo con un nombre curioso, me da por ver su sinopsis. Puede parecer algo muy pesado, pero para mi es sorprendente lo que aparece cada día :lol:

* Un poco de memoria de módulos que he visto o usado en el pasado, sí 8)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Redondeo en Encuesta

Notapor bAsTeR » 2010-10-14 16:58 @749

Funcionó de las mil maravillas amigo, gracias de nuevo.

Tal vez algun día pueda llegar a ser como tú.

Gracias :D
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados