Errore nel calcolo delle percentuali - 2
Moderatori: roby, Moderators
Errore nel calcolo delle percentuali - 2
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
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
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
Il file è client/modules/Elezioni/gruppo.php e può essere scaricato da qui:
http://trac.eleonline.it/eleonline/brow ... format=raw
Roberto
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
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
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
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
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
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
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);
while ($temp2tot<100.00){
la riga:
if ("$temp2tot"=="100") return($temp3);
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:
messa prima dei due "while" sembra risolvere questo problema.
Daniele
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;
Daniele
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
http://trac.eleonline.it/eleonline/brow ... format=raw
http://trac.eleonline.it/eleonline/brow ... format=raw
Roberto
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
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
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
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
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
http://trac.eleonline.it/eleonline/brow ... format=raw
verifica se ora è tutto a posto e fammi sapere.
Grazie per la collaborazione.
Roberto
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
http://trac.eleonline.it/eleonline/brow ... format=raw
Roberto
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:
ho provato a mettere queste istruzioni:
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):
Daniele
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);
Codice: Seleziona tutto
foreach ($temp3 as $key => $val) {
if ($val==0) $temp2[$key]=1;
}
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