Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Flow74
    Registrato dal
    Nov 2005
    Messaggi
    15

    calcolo che non torna in somma variabili

    Ciao a tutti ... chi mi dice dove sbaglio ?

    Ho una serie di campi form (diciamo 4) di tipo testo in cui inserisco delle cifre.

    una funzione javascript attivata dall'evento onclick del pulsante submit del form, me ne valida i valori secondo una regxep (per la quale debbo ringraziare questo forum)

    queste variabili ( ipotizziamo $a $b $c $d ) vengono quindi spedite a una pagina php che controlla il prodotto :

    la somma di $a+$b+$c deve corrispondere al valore di $d

    per verificare questo, utilizzo una funzione php nella pagina che riceve i dati

    la funzione è un controllo di questo tipo :

    Codice PHP:
    $somma $a+$b+c;
    if (
    $d!=$somma) {
    echo 
    "i valori non corrispondono ecc. ecc...." 
    La funzione di per se sembra andare ma alcuni calcoli la mettono in crisi

    ad esempio passando questi valori :

    $d=99.99;
    $c=33.99;
    $b=33.00;
    $a=33.00;

    seppure una stampa di $d e di $somma dia a video lo stesso risultato viene lo stesso innescata la condizione if

    Ora ....cercando di dissipare il mistero, ho notato che i valori passati non sono propriamente del tipo che vorrei .... se per esempio , inserisco da un campo di modulo il valore 13 con una query SQL nel campo decimal (8.2) di un database mysql, quando lo recupero via SQL si è trasformato in 13.00

    questo NON succede facendo l'assegnazione dei valori dalla funzione di validazione lato client javascript (per cui 13 verra' passato come 13)

    Ho pensato che il problema fosse imputabile a questo ma cio' che non capisco è per quale motivo solo alcuni calcoli non funzionano ..


    Questi dati di input ad esempio danno un risultato ok
    $d=99.99;
    $c=33.33;
    $b=33.33;
    $a=33.33;


    mentre questi invece no
    $d=99.99; $d=99.99;
    $c=33.97; $c=33.77;
    $b=33.00; $b=33.22;
    $a=33.03; $a=33.00;

    e cosi' tante altre combinazioni

    da cosa puo' dipendere ?

    se è questione di tipo di variabili posso fare una conversione di queste ultime ?


    scusate se sono stato stralungo... ^^

  2. #2
    Probabilmente nel codice che hai inserito c'è un errore di copia.
    Sostituisci
    $somma = $a+$b+c;

    con

    $somma = $a+$b+$c;
    Se provi a fare una echo di $somma e $d
    vedrai che $somma corrisponde sempre ad $a+$b mentre c viene scartata.


    Comunque anche provando dopo la correzione da' errore lo stesso.
    Fatta la prova con
    $d=99.99;
    $c=33.99;
    $b=33;
    $a=33;

    $somma = 99.99

    ma stranamente $somma - $d = 1.4210854715202E-14


    ho cambiato la if in

    if (round($d,2)!=round($somma,2)) {


    BH

  3. #3
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746

    Re: calcolo che non torna in somma variabili

    Originariamente inviato da Flow74
    Ora ....cercando di dissipare il mistero, ho notato che i valori passati non sono propriamente del tipo che vorrei .... se per esempio , inserisco da un campo di modulo il valore 13 con una query SQL nel campo decimal (8.2) di un database mysql, quando lo recupero via SQL si è trasformato in 13.00

    questo NON succede facendo l'assegnazione dei valori dalla funzione di validazione lato client javascript (per cui 13 verra' passato come 13)
    se hai definito il campo decimal (8,2) è mysql che ti inserisce due zeri dopo la virgola, ed è utile visto che con gli euro serve così.

    Va bene la validazione lato client che per l'utente è più veloce, ma per maggiore sicurezza ti consiglio di validare i numeri anche lato server sempre con le espressioni regolari.

    Errare humanum est, perseverare ovest

  4. #4
    Utente di HTML.it L'avatar di Flow74
    Registrato dal
    Nov 2005
    Messaggi
    15
    Sostituisci
    $somma = $a+$b+c;

    con

    $somma = $a+$b+$c;
    Se provi a fare una echo di $somma e $d
    vedrai che $somma corrisponde sempre ad $a+$b mentre c viene scartata.

    BH
    ehm no -_- ....quello è un errore di digitazione qui nel forum ...

    I miei test di stampa del risultato danno in realta' sempre il valore giusto ....

    ad esempio mi viene stampato in ogni caso:
    $somma = 99.99
    $d = 99.99

    apparentemente sarebbe corretto ma in caso gli operandi siano come quelli che ho citato nel messaggio originale il controllo if ($d!=$somma) restituisce il valore sbagliato

    ripeto, solo in certi casi mentre in altri funziona apparentemente senza problemi



    se hai definito il campo decimal (8,2) è mysql che ti inserisce due zeri dopo la virgola, ed è utile visto che con gli euro serve così.
    Infatti nei calcoli che utilizzano i dati presi dal db in seguito all'immissione non ho problemi.. ma in questo caso il controllo non ha a che fare con il db e quindi mi trovo con dei valori che non sono in formato decimal 8,2 come vorrei

    dato che temo (spero di trovare conferma qui e di capire il perchè') che il controllo incasini il suo lavoro proprio per la natura dei dati mi sarebbe utile convertire i valori in tipo decimale dal javascript stesso

    e' fattibile ?? esiste una funzione per la conversione dei dati di una variabile ?

    inoltre, se decidessi di riscrivere il controllo in php, la regexp che uso nel js sarebbe la medesima o i due linguaggi utilizzano una sintassi differente ?

    grazie
    ciao ^^

  5. #5
    Utente di HTML.it L'avatar di Flow74
    Registrato dal
    Nov 2005
    Messaggi
    15
    Ciao a tutti,

    per ora ho risolto con una tabella di swap in cui inserisco i dati e dalla quale li recupero (modificati da mysql) in formato decimal 8,2

    pero' mi sembra assurdo ... non c'è un altro modo ?

    in secondo luogo poi, vorrei capire perche' solo con certe cifre negli operandi la somma non soddisfa il controllo
    perche' non sempre a questo punto ?
    :/

  6. #6
    Non hai provato con la funzione round come ti avevo detto.... a me funziona!!!

    Dai dati che hai indicato sembra che il problema si verifica solo quando hai valori interi...
    xxx.00

    Infatti se stampi a video i due valori ad occhio sembrano uguali ma c'è qualcosa che li sporca
    infatti se fai la $somma - $d noterai la differenza



    BH

  7. #7
    Utente di HTML.it L'avatar di Flow74
    Registrato dal
    Nov 2005
    Messaggi
    15
    Non hai provato con la funzione round come ti avevo detto.... a me funziona!!!
    ^_^

    Non avevo provato perche' quando ho letto il tuo post non avevo proprio visto la tua soluzione con la funzione round!

    funziona alla grande... mille grazie Bl@ckH@t.
    sei stato molto, molto prezioso !!!

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.