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:
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Math::Round::Fair 'round_fair';
my $total = 100;
my @valores = qw(
5.53
12.35
42.4
22.21
12.12
3.01
0.21
2.18
);
my @disposicion = round_fair($total, @valores);
print "@disposicion\n";
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
y la salida es alguna de estas:
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:
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?