Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    14

    ciclo for step decimale

    ciao a tutti, devo fare un clico for con step 0.1 da 14 a 20

    ho notato un problema, se faccio
    for($umidita = 14; $umidita < 16; $umidita+= 0.10)

    il 16 me lo conta

    me se faccio
    for($umidita = 14; $umidita <= 17; $umidita+= 0.10)

    non mi conta il 17

    Con i numeri prima del 16 mi conta l'ultimo ciclo anche solo con il <
    con i numeri oltre il 17 non li conta anche se metto <=

    Sapete dirmi perchè si comporta così?

    Ultima modifica di brt91; 03-04-2014 a 18:37

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Magari se metti <= te lo conta.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    14
    scusa, ho modificato il messaggio, avevo sbagliato a scrivere.
    dopo il 17 salta l'ultimo ciclo

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    L'ultimo cilco è quello per $umidita=17, quello dopo è ovvio che lo salta perché la condizione del for non è più verificata, $umidita in quel caso vale 17.1 che è > 17
    Ultima modifica di Alhazred; 03-04-2014 a 18:44

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Ok, ho fatto una prova ed ho capito cosa intendi.
    In effetti e ben strano il comportamento, se si inizia il ciclo con numeri da 1 a 12 funziona, se invece si inizia da 13 in su non va più.

    Secondo me c'è qualche problema sulla rappresentazione dei numeri decimali.
    Probabilmente $umidita non varrà 17.0 ma tipo 16.99999999999999999 o 17.000000000000000000000001

    Per evitarti il problema, moltiplica tutto per 10, così il ciclo lo puoi fare su numeri interi

    for ($umidita = 140; $umidita <= 170; $umidita++)

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Sì, come pensavo, 17 in realtà vale 17.00000000000000710543 (considerando 20 decimai)

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    14
    Grazie per la risposta,
    però c'è un motivo perchè si comporta così?

    Perhè con i numeri interi funziona correttamente mentre per i decimali arrotonda come piace a lui?

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Perché non si possono rappresentare infiniti numeri decimali su un PC (anche i numeri interi sono in numero finito a seconda dei bit che vengono usati, per esempio con 16bit si possono rappresentare solo 65536 numeri interi), quindi l'insieme dei numeri rappresentabili è discreto (in numero finito).

    Con gli arrotondamenti si può risolvere la cosa, a te per esempio ti basta 1 cifra decimale, quindi potresti anche fare

    round($umidita,1) <= 17

    e dovrebbe funzionarti perché il numero che ti ho scritto prima, arrotondato ad una cifra decimale è esattamente 17.0

  9. #9
    quoto l'uso di round. interessante questo thread
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    14
    Ho provato con il round e funziona, grazie mille

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 © 2025 vBulletin Solutions, Inc. All rights reserved.