bug con switch su float

barbarina

Nuovo Utente
26 Mar 2008
2
0
0
Ciao a tutti,
ho un problema singolare,

ho un case su numeri float e nel caso in cui passo 0, nonostante la condizione del case e' FALSE, ci entra ed esegue la porzione errata, qualcuno sa dirmi perche'?



$valoreGiornaliero=(1 - 22/22); //QUINDI 0
$valoreGiornaliero=round($valoreGiornaliero*100,2);//ancora 0
$target=0.80;
$sogliaMinima=1.00;
$sogliaMassima=1.50;

switch($valoreGiornaliero){

case ($valoreGiornaliero<=$target):$colore="33FF00";//verde
break;

case ((($valoreGiornaliero>$target) and ($valoreGiornaliero <=
$sogliaMinima))):
$colore="FFFF00";//giallo
break;

case ($valoreGiornaliero>$sogliaMinima):
$colore="FF0000";//rosso
break;

default: $colore="003399";
break;

} // switch


funziona con qualsiasi valore tranne che con 0!!!! se passo 0 mi dice GIALLO!!!
Aiutatemi vi prego:eek:
 
soluzione al bug

Ciao,
con il controllo sul valore se è pari a 0 va bene ma non riesco a capire il perche'. Il bello è che se eseguo un var_dump sulle condizioni dello switch esce che la condizione in cui 0<0.80 e' true ma salta e va al passo successivo dove la condizione risulta FALSE (e il var_dump lo conferma)ma esegue lo stesso la porzione di codice (provare per credere). Temo sia un bel bug di php!!! :incazz:
Ad ogni modo ci ho messo "una pezza" e funziona, solo che sono in pensiero su altre possibili anomalie :confused:

Grazie mille per l'aiuto.

Ciao Ciao:D
 
Conosco ancora troppo poco il PHP (W ASP) per poter dire che si tratta di un'eccezione nativa o di chissà cosa.

L'importante è che funzioni: non consuma memoria, è semplice e veloce!

Man mano che approfondirai la tua conoscenza del PHP, magari, ti renderai conto di come gestire quell'eccezione (se di eccezione si tratta) e potrai affinare lo script.

Ciao :)
 
Non è assolutamente un'anomalia, ma è solo il risultato di un uso improprio dello switch. Lo switch non è pensato per usare delle condizioni nei case, ma per effettuare un matching tra quello che c'è nello switch e quello che c'è nei vari case. Se un case coincide con lo switch, il relativo codice viene eseguito. Non riesco a spiegarmi bene, ma vedo di tradurre il tuo switch nell'equivalente con if:

PHP:
if ( $valoreGiornaliero == ($valoreGiornaliero<=$target)
{
	$colore="33FF00"; //verde
}
else if ( $valoreGiornaliero == ((($valoreGiornaliero>$target) and ($valoreGiornaliero <=$sogliaMinima)))
{
	$colore="FFFF00"; //giallo
}
else if ( $valoreGiornaliero == ($valoreGiornaliero>$sogliaMinima)
{
	$colore="FF0000";//rosso
{
else
{
	$colore="003399";
}

nel caso in cui $valoreGiornaliero è "0" diventa così:

// 0<=$target è VERO quindi il suo risultato sarà TRUE, ma TRUE vale 1 e quindi nel complesso viene 0 == 1 che è falsa e quindi non entra
if ( 0 == (0<=$target)
{
	$colore="33FF00"; //verde
}
// 0>$target è FALSO, 0<=$sogliaMinima è FALSO quindi danno FALSE, ma FALSE vale 0 quindi nel complesso 0 == 0 è vero quindi entra qui dentro!!!!
else if ( 0 == (((0>$target) and (0 <=$sogliaMinima)))
{
	$colore="FFFF00"; //giallo
}
else if ( 0 == (0>$sogliaMinima)
{
	$colore="FF0000";//rosso
{
else
{
	$colore="003399";
}

Non so se sono riuscito a spiegarmi, ma la sostanza è che è sbagliato usare lo switch...case in quel modo.
 
I "bug di php" sono un pò come i virus per i Pc, quando qualcosa non funziona è sempre colpa loro :D
 

Discussioni simili