Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con i numeri decimali

    Ciao a tutti!
    Mi trovo davanti ad un problema inspiegabile :S

    In pratica ho un semplice ciclo if che vi propongo di seguito:
    codice:
    if ($voto_utente_media < '0.5') { $scale = '0';}
    if ($voto_utente_media > '0.5') { $scale = '1';}
    if ($voto_utente_media > '1.0') { $scale = '2';}
    if ($voto_utente_media > '1.5') { $scale = '3';}
    if ($voto_utente_media >  '2.0') { $scale = '4';}
    if ($voto_utente_media >  '2.5') { $scale = '5';}
    if ($voto_utente_media >  '3.0') { $scale = '6';}
    if ($voto_utente_media >  '3.5') { $scale = '7';}
    if ($voto_utente_media >  '4.0') { $scale = '8';}
    if ($voto_utente_media >  '4.5') { $scale = '9';}
    if ($voto_utente_media >  '5.0') { $scale = '10';}
    if ($voto_utente_media >  '5.5') { $scale = '11';}
    if ($voto_utente_media >  '6.0') { $scale = '12';}
    if ($voto_utente_media >  '6.5') { $scale = '13';}
    if ($voto_utente_media >  '7.0') { $scale = '14';}
    if ($voto_utente_media >  '7.5') { $scale = '15';}
    if ($voto_utente_media >  '8.0') { $scale = '16';}
    if ($voto_utente_media >  '8.5') { $scale = '17';}
    if ($voto_utente_media >  '9.0') { $scale = '18';}
    if ($voto_utente_media >  '9.5') { $scale = '19';}
    if ($voto_utente_media ==  '10.0') { $scale = '20';}
    Ottengo i seguenti risultati strani:
    se $voto_utente_media è uguale a "0.0" ottenngo uno $scale = '1' mentre dovrebbe essere '0'
    se $voto_utente_media è uguale a "0.1" ottengo uno $scale = '15' mentre dovrebbe essere sempre '0' :S
    se $voto è uguale a "7.0" ottengo $scale = '15' mentre dovrebbe essere '14'

    Scusate se ho scritto in "linguaggio macchina" ma era il modo più semplice per spiegarmi... come mai succede questo? Non riesco a lavorare con i decimali

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    28
    Secondo me... se $voto_utente_media è un float i controlli dovresti farli così:

    Codice PHP:
    if ($voto_utente_media 0.5) { $scale '0';}
    if (
    $voto_utente_media 0.5) { $scale '1';}
    if (
    $voto_utente_media 1.0) { $scale '2';}
    if (
    $voto_utente_media 1.5) { $scale '3';}
    if (
    $voto_utente_media 2.0) { $scale '4';}
    if (
    $voto_utente_media 2.5) { $scale '5';}
    if (
    $voto_utente_media 3.0) { $scale '6';}
    if (
    $voto_utente_media 3.5) { $scale '7';}
    if (
    $voto_utente_media 4.0) { $scale '8';}
    if (
    $voto_utente_media 4.5) { $scale '9';}
    if (
    $voto_utente_media 5.0) { $scale '10';}
    if (
    $voto_utente_media 5.5) { $scale '11';}
    if (
    $voto_utente_media 6.0) { $scale '12';}
    if (
    $voto_utente_media 6.5) { $scale '13';}
    if (
    $voto_utente_media 7.0) { $scale '14';}
    if (
    $voto_utente_media 7.5) { $scale '15';}
    if (
    $voto_utente_media 8.0) { $scale '16';}
    if (
    $voto_utente_media 8.5) { $scale '17';}
    if (
    $voto_utente_media 9.0) { $scale '18';}
    if (
    $voto_utente_media 9.5) { $scale '19';}
    if (
    $voto_utente_media == 10.0) { $scale '20';} 
    Gli apici dovresti toglierli anche nel caso in cui consideri $scale come un intero.
    Teo

  3. #3
    Originariamente inviato da ciqciq
    Secondo me... se $voto_utente_media è un float i controlli dovresti farli così:


    Gli apici dovresti toglierli anche nel caso in cui consideri $scale come un intero.
    Ti ringrazio per il suggerimento, non ci avevo proprio pensato a questa cosa... sinceramente non so se $voto_utente_media sia un float... a dire il vero non so bene cosa significhi :S

    In ogni caso il valore di $scale mi serve solo per avere un grafico a livello di template, e ragionando meglio sul ciclo l'ho modificato perché dovrebbe funzionare così:
    Codice PHP:
    if ($voto_utente_media 0.5) { $scale '0';}
    if (
    $voto_utente_media <= 0.5) { $scale '1';}
    if (
    $voto_utente_media <= 1.0) { $scale '2';}
    if (
    $voto_utente_media <= 1.5) { $scale '3';}
    if (
    $voto_utente_media <=  2.0) { $scale '4';}
    if (
    $voto_utente_media <=  2.5) { $scale '5';}
    if (
    $voto_utente_media <=  3.0) { $scale '6';}
    if (
    $voto_utente_media <=  3.5) { $scale '7';}
    if (
    $voto_utente_media <=  4.0) { $scale '8';}
    if (
    $voto_utente_media <=  4.5) { $scale '9';}
    if (
    $voto_utente_media <=  5.0) { $scale '10';}
    if (
    $voto_utente_media <=  5.5) { $scale '11';}
    if (
    $voto_utente_media <=  6.0) { $scale '12';}
    if (
    $voto_utente_media <=  6.5) { $scale '13';}
    if (
    $voto_utente_media <=  7.0) { $scale '14';}
    if (
    $voto_utente_media <=  7.5) { $scale '15';}
    if (
    $voto_utente_media <=  8.0) { $scale '16';}
    if (
    $voto_utente_media <=  8.5) { $scale '17';}
    if (
    $voto_utente_media <=  9.0) { $scale '18';}
    if (
    $voto_utente_media <=  9.5) { $scale '19';}
    if (
    $voto_utente_media >  10.0) { $scale '20';} 
    Purtroppo anche togliendo gli apici ottengo lo stesso risultato di prima...

    In pratica la mia condizione, in linguaggio umano, dovrebbe essere

    SE $voto è minore o tutt'al più uguale a X ALLORA $scale sarà uguale a Y

    quindi
    se $voto = 9.4 { $scale = 19}
    se $ voto = 9.5 { $scale = 19} mentre ottengo $scale = 20
    se $voto = 0.0 { $scale = 0 } mentre ottengo $scale = 1
    l'assurdo: se $voto = 0.3 { $scale = 15} :S

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    28
    Secondo me se metti il maggiore o uguale ( >= ) al posto del minore o uguale ( <= ) tutto funziona meglio.

    Ti spiego: prova a simulare mentalmente l'esecuzione del codice:

    Poniamo $voto=0.0

    0.0<0.5? SI --- $scala = '1'
    0.0<=0.5? SI --- $scala = '2' (tra l'altro questo controllo è più o meno identico al precedente)
    0.0<=1.0? SI --- $scala = '3'
    ...
    ...
    0.0<=9.0? SI --- $scala = '18'
    0.0<=9.5? SI --- $scala = '19'
    0.0>10.0? SI --- $scala = '20'

    Quindi $scala = '20'!!! Ovvio che è sbagliato

    Proviamo con il maggiore o uguale:

    Poniamo $voto=9.4

    9.4<0.5? NO
    9.4>=0.5? SI --- $scala = '1'
    9.4>=1.0? SI --- $scala = '2'
    ...
    ...
    9.4>=9.0? SI --- $scala = '18'
    9.4>=9.5? NO
    9.4>=10.0? NO

    Quindi $scala='18'!
    Che è corretto!
    Teo

  5. #5
    Effettivamente mi sono impelagato in questi semplici calcoli matematici e ho fatto confusione :S
    Ho riportato tutte le condizioni a >= (come era lo script in principio) ma ancora non mi raccapezzolo :S

    Poniamo che ad esempio ho il $voto = 4.0

    4.0 < 0.5 ? NO -- $scala = ?
    4.0 => 0.5 ? SI -- $scala = 1
    4.0 => 1.0 ? SI -- $scala = 2
    4.0 => 1.5 ? SI -- $scala = 3
    4.0 => 2.0 ? SI -- $scala = 4
    4.0 => 2.5 ? SI -- $scala = 5
    4.0 => 3.0 ? SI -- $scala = 6
    4.0 => 3.5 ? SI -- $scala = 7
    4.0 => 4.0 ? SI -- $scala = 8
    4.0 => 4.5 ? NO -- $scala dovrebbe essere = 8 e qui dovrebbe fermarsi

    invece continua e mi restituisce $scala = 11 che corrisponde a 4 => 5.5 :S

    per le mie scarse conoscenze matematice 4.0 non è né uguale né maggiore di 5.5 per cui una volta arrivato a 4.0 0=> 4.0 dovrebbe fermarsi... forse devo aggiungere ad ogni ciclo if un else { $scala = '';} ?

  6. #6
    Codice PHP:
    $Input = (int) 1;
    $Total = (int) 20;

    $voto_utente_media = (float) 1.5//<-- Valore di prova, eliminare dopo compreso il meccanismo.

    $scaleArray = array();

    while ( 
    $Input <= $Total )
    {
        
    $Product = (float) $Input 2;
        
        if( 
    $voto_utente_media <= $Product)
        {
            
    array_push($scaleArray$Input);
            
        }
        
        
    $Input++;
    }



    $scale $scaleArray[0];

    echo 
    $scale//<-- Stampa il valore 

  7. #7
    Ah, per il problema dello 0, metti input a 0, anzichè ad uno =).

    Codice PHP:
    $Input = (int) 0

  8. #8
    Kajin, ti ringrazio di vero cuore.
    Il tuo script funziona e mi ha fatto capire molte cose che prima ignoravo. Come si dice, ho preso due piccioni con una fava

    Grazie anche a ciqciq che mi ha fatto ripassare un po' di algebra

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    28
    Continuo a non capire il problema. VVoVe:
    A livello teorico il codice funzionava. Non capisco come sia possibile che risultino valori sballati. E' semplice matematica, in fin dei conti.

    Comunque non importa.
    L'importante è che ora tutto funzioni!


    Teo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.