Errore nel calcolo delle percentuali - 2

Avvisi e discussioni su bug, soluzioni e migliorie del software

Moderatori: roby, Moderators

margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Errore nel calcolo delle percentuali - 2

Messaggio da margottid »

Le percentuali visualizzate in home page (http://elezioni.comune.lugo.ra.it/client/modules.php) differiscono da quelle che si vedono nel dettaglio (http://elezioni.comune.lugo.ra.it/clien ... id_lista=0),
Al candidato vincitore vengono assegnati, in una pagina, il 56,29% dei voti, e in un'altra il 56,30% (e, in quest'ultima, il totale dei voti risulta essere il 100,01%).

Daniele
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Il problema degli arrotondamenti devo ancora vederlo, intanto ho fatto la modifica per correggere le percentuali visualizzate nei riepiloghi (ripeto manca la precesione nell'arrotondamento).
Il file è client/modules/Elezioni/gruppo.php e può essere scaricato da qui:
http://trac.eleonline.it/eleonline/brow ... format=raw
Roberto
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Ho creato la funzione per la gestione delle percentuali, compresa verifica degli arrotondamenti. Per ora l'ho applicata SOLO AI TOTALI nella visualizzazione delle griglie dei "Risultati", chi vuole verificare che sia a posto può scaricare i due file necessari da qui:
https://trac.eleonline.it/eleonline/bro ... format=raw
https://trac.eleonline.it/eleonline/bro ... format=raw
Ringrazio chi vorrà fare un report del test.
Roberto
margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Messaggio da margottid »

Ho caricato i nuovi file.

Errore da correggere:
Nella pagina della "Lista per Circoscrizione" (http://elezioni.comune.lugo.ra.it/clien ... id_lista=0), i voti contestati sono pari a 0 (zero), ma viene indicata una percentuale del 0,01%.
La stessa cosa succede nella "Lista per sezioni".

Anomalia su cui fare delle riflessioni:
Nella colonna "Totale complessivo", la somma delle percentuali date alle liste è pari a 100,01%.
Stessa cosa se si fa la somma all'interno delle singole sezioni o delle circoscrizioni (sia per le Liste che per il Candidato Presidente): in alcuni casi la somma è 100,01%, in altri casi è 99,99%.
Questo però dipende dall'arrotondamento a due cifre: se, negli arrotondamenti all'interno dello stesso gruppo, le quantità aggiunte (a causa degli arrotondamenti per eccesso) superano le quantità tolte (per gli arrotondamenti per difetto), o viceversa, la somma non fa più 100%.
Non so se questo problema sia superabile, e come viene risolto quando il Ministero dell'Interno diffonde i dati ufficiali.

Ad esempio, guardando la pagina con i dati ufficiali della mia Regione (http://regionali.interno.it/regio100328/R08.htm), noto che tutte le percentuali sono state arrotondate per difetto, e infatti la somma delle percentuali dei voti ai Candidati Presidenti o alle Liste è inferiore al 100%.

Ci sono indicazioni ufficiali al riguardo?
Potrebbe essere una buona convenzione arrotondare sempre per difetto?
Oppure arrotondare alla seconda cifra decimale in maniera "matematica" (per eccesso o per difetto a seconda dei casi)?
Sapendo comunque che, in alcuni casi, la somma delle percentuali potrebbe essere diversa dal 100%...

Daniele
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Ricontrollo con le indicazioni che mi hai dato.
Rispetto alle riflessioni, fino ad ora l'impostazione nel programma era quella di calcolare in maniera indipendente ogni percentuale con il risultato che la percentuale, arrotondata per eccesso per valori compresi tra 0 e 4, e per difetto per valori tra 5 e 9, porta a totali diversi dal 100%. Faccio un esempio con tre percentuali:
52,988
42,526
0,486
così come sono portano a una somma uguale a 100 ma se le arrotondiamo a due cifre decimali tutte e tre aumentano di una unità portando il totale a 100,01.
La funzione che sto elaborando prevede di decrementare il valore piu' basso o aumentare il piu' alto fino a che la somma sia 100.00
Mi sembrava la soluzione piu' logica.
Comunque sonoaperto a valutazioni diverse,
Roberto
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Credo si tratti di un bug del php, in pratica se il valore totale è esattamente 100 fallisce il controllo "while $valore<100" che viene eseguito mentre non dovrebbe. Ho provato anche con un "if $valore<100" ma è uguale funziona invece con un controllo testuale, quindi dovresti provare ad aggiungere prima della riga:
while ($temp2tot<100.00){
la riga:
if ("$temp2tot"=="100") return($temp3);
margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Messaggio da margottid »

Forse il problema è nella gestione dei float in PHP.
Nel mio caso, anche quando la variable $temp2tot dovrebbe valere 100, in realtà differisce di una quantità infinitesimale: se chiedo di mostrare il valore di $temp2tot-100, salta fuori -1.42108547152E-14 (invece di zero).

Una (seppur poco elegante) istruzione:

Codice: Seleziona tutto

$temp2tot=intval($temp2tot*100)/100;
messa prima dei due "while" sembra risolvere questo problema.

Daniele
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Ho applicato la funzione all'intera griglia, mancano i referendum e le altre pagine ma così si può provare in maniera più approfondita. I link sono questi:
http://trac.eleonline.it/eleonline/brow ... format=raw

http://trac.eleonline.it/eleonline/brow ... format=raw

Roberto
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Grazie a Daniele per aver appurato che non si tratta di un bug, per ora lascio la funzione con il controllo di tipo testuale, decideremo più in la come impostarla definitivamente.
Ho mandato sul trac anche le correzioni per i gruppi in prima pagina
http://trac.eleonline.it/eleonline/brow ... format=raw
e i grafici:
http://trac.eleonline.it/eleonline/brow ... format=raw
Inoltre ho ritoccato la funzione ele_voti in admin/modules/Elezioni
http://trac.eleonline.it/eleonline/brow ... format=raw
Come sempre i report sono graditissimi.
Roberto
margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Messaggio da margottid »

Nel mio caso (http://elezioni.comune.lugo.ra.it) i grafici continuano a differire dalla tabella.

La percentuale del candidato vincitore è 56.2946: questo parametro viene passato, per la creazione del grafico a barre, arrotondato alla terza cifra decimale (56.295), e a sua volta viene arrotondato per eccesso (56.30) all'interno del grafico, mentre la percentuale corretta è 56.29.

Potrebbe essere sufficiente modificare il file "grafici.php", nelle righe che preparano gli array dei voti ($pro[$i] e $pre[$i]), correggendo il secondo parametro della funzione "number_format()" da 3 a 2, in modo da arrotondare alla seconda cifra decimale anziché alla terza?
Oppure anche questo richiede un controllo più "fine" degli arrotondamenti?

(Lo stesso problema si presenta nella visualizzazione del blocco "02_risultati.php", e forse anche qui la soluzione protrebbe essere analoga).

Daniele
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

I dati interni ai grafici non li avevo inseriti nel controllo perché mi sembrava che gestissero autonomamente, in maniera corretta, le percentuali. Evidentemente no. Ora vedo di inglobarli.
Roberto
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Qui trovi il file dei grafici modificato:
http://trac.eleonline.it/eleonline/brow ... format=raw
verifica se ora è tutto a posto e fammi sapere.
Grazie per la collaborazione.
Roberto
margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Messaggio da margottid »

Perfetto! :)

Ora manca solo la correzione del Widget "02_risultati"... :wink:

Grazie mille,
Daniele
roby
Site Admin
Site Admin
Messaggi: 1260
Iscritto il: ven apr 25, 2008 12:00 am
Contatta:

Messaggio da roby »

Ecco anche il file per 02_risultati, il file modificato è client/modules/Elezioni/funzioni.php e questo è il link:
http://trac.eleonline.it/eleonline/brow ... format=raw
Roberto
margottid
Newbie
Newbie
Messaggi: 193
Iscritto il: mar mag 12, 2009 12:00 am

Messaggio da margottid »

Grazie mille, il widget ora funziona bene.

Torno sugli arrotondamenti, e precisamente nel caso in cui - anche se il valore assoluto è zero - la percentuale viene impostata a 0,01.

Guardando la funzione mi sembra di intuire che, se la somma delle percentuali è inferiore al 100%, viene dato un centesimo di punto a chi ha avuto l'arrotondamento minore.
Però, per quelle righe in cui il valore è 0, non c'è stato arrotondamento, e proprio questi valori vengono considerati come quelli che hanno avuto il minor arrotondamento!

Dopo la riga:

Codice: Seleziona tutto

if("$temp2tot"=="100") return($temp3);
ho provato a mettere queste istruzioni:

Codice: Seleziona tutto

foreach ($temp3 as $key => $val) {
if ($val==0) $temp2[$key]=1;
}
Se non ho interpretato male il significato delle variabili, questo ciclo controlla se il valore della percentuale è 0, e in quel caso imposta a 1 il relativo arrotondamento (in modo da escluderlo matematicamente quando si cerca l'arrotondamento minore).

Volendo essere ancora più fini, si potrebbero escludere tutti quei valori che non sono stati arrotondati, in modo da non toccare le percentuali "tonde" (caso improbabile, ma comunque possibile), e in questo casi il ciclo andrebbe fatto sull'array degli arrotondamenti (e non su quello delle effettive percentuali):

Codice: Seleziona tutto

foreach ($temp2 as $key => $val) {
if ($val==0) $temp2[$key]=1;
}


Daniele
Rispondi