Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Float e sottrazioni

  1. #1

    Float e sottrazioni

    Ciao. Ho un campo in una tabella di tipo float, con cui faccio operazioni matemaiche tramite query.

    Esempio

    codice:
    UPDATE tabella SET Credito = Credito - 0.2
    ora vorrei chi mi chiariste un dubbio.

    Se il campo in questione ha valore ad esempio 0.2, e la sottrazione è 0.2 invece di risultare 0 il valore mi da 3.27826e-08

    come mai?

    grazie
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  2. #2
    ho provato con il tipo Double ma uguale
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    i campi float e double sono campi approssimati, quindi il risultato che ti ritorna è infinitamente piccolo, quasi zero ma non proprio zero. Quello che stupisce però è che non dovrebbe partire con l'approssimazione per una operazione così semplice. Non è che prima fai altre operazioni? no perché addizioni e moltiplicazioni nei calcolatori non sono commutative proprio per problemi di overflow nei tipi esatti e perdita di precisione con i tipi a virgola mobile...

    l'unica soluzione che posso suggerirti è di non fare mai confronti esatti, vale a dire non fare mai un operazione del genere:

    $miaVarFloat1 == $miaVarFloat2

    proprio per i problemi sopracitati. Ti conviene invece fare

    $miaVarFloat1 - $miaVarFloat2 <= $tolleranza

    la variabile tolleranza contiene un numero abbastanza piccolo da essere considerato tollerabile nel tuo programma.

  4. #4
    Originariamente inviato da kuarl
    i campi float e double sono campi approssimati, quindi il risultato che ti ritorna è infinitamente piccolo, quasi zero ma non proprio zero. Quello che stupisce però è che non dovrebbe partire con l'approssimazione per una operazione così semplice. Non è che prima fai altre operazioni? no perché addizioni e moltiplicazioni nei calcolatori non sono commutative proprio per problemi di overflow nei tipi esatti e perdita di precisione con i tipi a virgola mobile...

    l'unica soluzione che posso suggerirti è di non fare mai confronti esatti, vale a dire non fare mai un operazione del genere:

    $miaVarFloat1 == $miaVarFloat2

    proprio per i problemi sopracitati. Ti conviene invece fare

    $miaVarFloat1 - $miaVarFloat2 <= $tolleranza

    la variabile tolleranza contiene un numero abbastanza piccolo da essere considerato tollerabile nel tuo programma.

    che casino!!

    beh a me servirebbe la precisione in quanto sto simulando una sorta di credito sul cellulare. Quindi sottraggo i 0.2 centesimi del costo dell'sms tipo ai 0.8 di credito di residuo.

    Non capisco, uff
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  5. #5
    uppo la questione per fare un'altra domanda. Siccome mi si crea ancora questo problema dei centesimi millessimi etc etc che si creano, se imposto Lunghezza/Set del campo tipo 8,1 non dovrebbe comparirmi massimo 1 numero dopo la virgola?
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  6. #6
    è una soluzione più lunga e necessita di due query...

    però... se prima con una select ti leggi il valore di credito e poi con php esegui i calcoli e aggiorni il valore di Credito specificando il valore esatto?

    esempio
    Codice PHP:
    SELECT credito....

    ...

    $residuo $row['credito'] - 0.2;

    UPDATE tabella SET Credito $residuo
    fai una prova per vedere se in questo modo ti restituisce 0;

    ciauzz

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.