Newsgroup: it.comp.appl.access
Titolo: Confronto fra campi numerici

Ciao a tutti,
ho un problema con il confronto di :
- 1 campo di comodo(Totale) definito double dove ottengo il totale di piu'
controlli (ctlA,ctlB,ctlC, che hanno come origine, campi di una tabella
definiti Standard, 2 decimali, precisione doppia) con
- 1 valore di un controllo (Crediti) che ha come origine il campo di una
tabella definito Standard, 2 decimali, precisione doppia.
Dietro il consiglio di Sergio Mazza (mi ha suggerito di usare la funzione
TypeName), ho controllato il tipo di campo di tutti i valori coinvolti nel
calcolo e nel confronto. La funzione TypeName mi dice in fase di Debug :
ctlA ==> TextBox    ctlA ==> TextBox
ctlA ==> TextBox
Crediti ==> TextBox
Totale(che e' = a ctlA+ctlB+ctlC)  ==> Double
Quando faccio il confronto fra Totale e Crediti pur vedendo lo stesso valore
con i 2 decimali esce per diverso.
Scusate ma, non ho dimestichezza con i valori DOUBLE ho quasi sempre
definito i campi Variant. In questo NG ho letto piu' volte che per campi
numerici era sconsigliato definrli Variant.
Qualcuno mi puo' aiutare ?
Grazie.
Maurizio

 ha scritto nel messaggio
news:ZAdHa.91566$Ny5.2...@twister2.libero.it...

Ciao maurizio
Stai inciampando nell'imprecisione del tipo di dato double in presenza di
decimali.
Visto che al massimo utilizzi due decimali fai il confronto convertendo in
currency.
Esempio
Debug.Print  .7=244-243.3
Restituisce Falso
Debug.Print CCur(.7)=CCur(244-243.3)
Restituisce Vero.
Ciao Giorigo.

Adesso ho definito un campo Comodox Double e dopo l'istruzione Comodox =
Crediti
faccio il confronto di Totale con Comodox
ed esce ancora per diverso nonostante Totale e Comodox contengano
visivamente lo stesso valore e risultano (con TypeName) entrambi Double.
Divento matto !!
Se qualcuno mi puo' illuminare, gli sono grato.
Ciao.
Maurizio

 ha scritto nel messaggio
news:z8fHa.94247$lK4.2...@twister1.libero.it...

Ciao Maurizio
Non c'č nulla di strano.
 I tipi di dati singola precisione o doppia precisione sono approssimati e
da
utilizzare con dati numerici a virgola mobile (area di un cerchio, logaritmo
di un numero ecc) . Non tutti i valori possono essere rappresentati nei vari
tipi di dati in modo preciso.
Se la tua versione di Access č 2000 o superiore puoi utilizzare per le
tabelle
il tipo decimal in cui indichi la precisione e il numero di decimali da
adottare.
Access normalmente utilizza il tipo double per eseguire i calcoli e per la
natura del metodo binario il risultato puň essere approssimato, infatti se
provi a fare una semplice sottrazione 244-243.3 otterrai 0,699999999999989.
Con Ccur() converti e arrotondi il numero in currency che prevede MAX 4
decimali, se hai bisogno di piů decimali con precisione puoi utilizzare una
variabile variant e forzare il piano di calcolo sul sottotipo decimal con
Cdec(), infatti  con  Debug.Print  Cdec(244)-243.3 otterrai il valore esatto
0,7.
Ciao Giorgio.

 CUT
Grazie Giorgio,
sei stato veramente molto gentile e te ne sono grato e mi sento in dovere di
ringraziarti. Mi hai dato proprio la risposta che aspettavo anche se ancora
non ho fatto delle prove ma quello che scrivi mi sembra molto professionale.
Grazie ancora e ciao.
Maurizio