Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Redondeo en Encuesta Responder al tema
Nuevo tema


Página 1 de 1  [ 5 mensajes ] 
 
Nota 2010-10-14 12:23 @558

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Redondeo en Encuesta
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%.

_________________
Say hello to my little friend!!!


Nota 2010-10-14 13:39 @610
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Redondeo en Encuesta
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:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
5,53
12,35
42,4
22,21
12,12
3,01
0,21
2,18
que suman 100,01.

Se lo pasamos al módulo:
Syntax: [ Download ] [ Hide ]
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";
y la salida es alguna de estas:
Syntax: [ Download ] [ Hide ]
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
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:
Syntax: [ Download ] [ Hide ]
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
pero... nos sigue quedando el trabajo del redondeo... vamos mal...

¿Alguna idea más?

_________________
JF^D Perl programming


Nota 2010-10-14 13:54 @621

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Re: Redondeo en Encuesta
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?

_________________
Say hello to my little friend!!!


Nota 2010-10-14 14:17 @637
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Redondeo en Encuesta
bAsTeR escribió:
¿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


Nota 2010-10-14 16:58 @749

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Re: Redondeo en Encuesta
Funcionó de las mil maravillas amigo, gracias de nuevo.

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

Gracias :D

_________________
Say hello to my little friend!!!


Responder al tema  [ 5 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO