Newsgroup: it.comp.www.php
Titolo: php+mysql: problemi con le percentuali

Salve ng.
Ho un problema con le percentuali.
In una tabella nel mio db ho i seguenti valori:
1900 - 800 - 800
Totale: 3500
Con il caro php faccio il seguente calcolo:  round(($valore/$totale)*100,2)
Ottengo le seguenti percentuali
54,29% - 22,86% - 22,86%  = 100,01%
Come è possibile?
Sto cercando una spiegazione ovunque da ore, ma senza successo.
Mi affido ad un vostro aiuto...
Luca

Salve ng


Totale: 3500


Luca
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ovvio che poi la somma non ti dà più 100.
Ma l'arrotondamento non dovrebbe eliminare tali potenziali errori?
Perchè su excel lo stesso ragionamento funziona?
Secondo te non è possibile risolvere tale problema fastidioso?
Thanks.


 Come è possibile?
Leggi gli esempi di round e capirai.
Ti suggerisco di calcolare tutti i valori tranne l'ultimo con round e
l'ultimo lo calcoli con una sottrazione.
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
L'uomo, conscio di sbagliare, persevera.

 Secondo te non è possibile risolvere tale problema fastidioso?
Ti suggerisco di calcolare tutti i valori tranne l'ultimo con round e


 l'ultimo lo calcoli con una sottrazione.
Ma se prendi l'esempio di prima, avrei per lo stesso ammontare 22,86% e
22,85% secondo il tuo ragionamento. Sarebbe comunque brutto da vedere.
In ogni caso, dove posso leggere gli esempi?
In questa pagina non c'è niente:
http://nl2.php.net/manual/en/function.round.php
Luca


 l'ultimo lo calcoli con una sottrazione.
Ma se prendi l'esempio di prima, avrei per lo stesso ammontare 22,86% e
22,85% secondo il tuo ragionamento. Sarebbe comunque brutto da vedere.
In ogni caso, dove posso leggere gli esempi?
In questa pagina non c'è niente:
http://nl2.php.net/manual/en/function.round.php
Luca
-- 


 
http://nl2.php.net/manual/en/function.round.php
Sono esattamente gli esempi a cui mi riferivo:
echo round (3.4); // 3
echo round (3.5); // 4
Nel tuo caso avresti:
echo round (54.285714, 2); // 54.29
echo round (22.857143, 2); // 22.86
echo round (22.857143, 2); // 22.86
Totale 100.01
Per la politica di cui sopra puoi decidere di utilizzare ad esempio il
valore piu' grande in modo che l'errore dell'arrotondamento sara' meno
rilevante sul valore totale.
-- 
I am what I am, I do what I can


 Luca
Sono comunque sorpreso di questa carenza di php. Lo segnalerei quasi come
un bug. Ho provato ad usare anche le funzioni matematiche bcdiv e bcmul ma
con peggiori risultati. Boh...
Grazie dell'aiuto.


 e bcmul ma con peggiori risultati. Boh...
Guarda che e' un tuo errore concettuale, non di PHP.
-- 
I am what I am, I do what I can


"Luca"  ha scritto nel messaggio

Questo non è per niente un bug, ma è inevitabile perchè l'errore è indotto
proprio dagli arrotondamenti, la soluzione di setec mi sembra la migliore
che si possa adottare per evitare che il totale non sia cento.
Comunque tieni presenti che i computer lavorano con una matematica binaria
ed in più lo spazio di memorizzazione è finito, al più un double viene
rappresentato con 64 bit quindi gli errori di precisione ci sono infatti il
computer non lavora con i numeri R (reali) ma con un suo sottoinsieme A
(numeri di macchina), prima di sparare a zero su php faresti bene a leggerti
un po' di libri sull'architettura dei computer e se proprio vorresti
conoscere come stimare gli errori o come poterli minimizzare potresti anche
studiarti un bel libro di analisi numerica.
Prova ad eseguire il seguente script
<?php
$a = 0.1;
$b = 0.0;
for ($i=0; $i<1000; $i++)
 $b += $a;
echo $b;
?>
secondo te quanto varrà $b alla fine del ciclo for?
Cmq php regge abbastanza bene prova a fare la stessa cosa in Java e vedrai
che comincerà a sputare fuori ca**ate già alla 10° iterazione?
Vuoi sapere perchè questo avviene? Prova a rappresentare in binario 0.1 e
poi mi fai sapere
ciao gigabyte