Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Errore calcolo con tipo dati Double
Forum - Visual Basic 6 - Errore calcolo con tipo dati Double

Avatar
symonx80 (Normal User)
Pro


Messaggi: 107
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 17:00
Martedì, 13/11/2012
Ciao,
ho un problema strano nella somma di tipi dati Double.
Devo fare la somma dei seguenti valori stringa che trasformo prima in double : 3,64 + (-3,71)
Il risultato che ottengo non è 0,07 bensì  -6,99999999999998E-02
Ho provato anche utilizzando il tipo dati Single ma senza successo.
Qualcuno può darmi una mano?
Grazie

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:18
Martedì, 13/11/2012
Assicurati di leggere questo: http://it.wikipedia.org/wiki/Numero_in_virgola_mobile#Prob ...

Quando fai confronti con numeri in virgola mobile devi utilizzare una funzione che prende in considerazione un range di valori intorno al numero che vuoi fare il confronto.

Ad esempio (in pseudocodice):

Codice sorgente - presumibilmente Visual Basic 6

  1. uguali(n1, n2):
  2.   return (n2 < n1 + 0.000001 AND n2 > n1 - 0.000001)



Il mio blog: https://piero.dev
PM Quote
Avatar
symonx80 (Normal User)
Pro


Messaggi: 107
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 17:30
Martedì, 13/11/2012
grazie, ho letto il link che mi hai girato ma ho problemi a trovare la soluzione al mio problema..
a cosa fa riferimento il codice che mi hai aggiunto? i due tipi di dato sono entrambi Double, il codice che utilizzo è il seguente
Codice sorgente - presumibilmente VB.NET

  1. dim impv1 as Double
  2. dim impv2 as Double
  3. dim Var_ImportoTotale as Double
  4.  
  5. impv1= CDbl("3,64")
  6. impv2= CDbl("-3,71")
  7.  
  8. Var_ImportoTotale = impv1 + impv2



perchè dovrei eseguire quel confronto?non capisco come risolvere il problema. :(


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:36
Martedì, 13/11/2012
Quando confronti due numeri a virgola mobile, devi prendere un range anziche' i due numeri direttamente (si puo' dire ad esempio che 0.0699999999 e' ~0.07 se a 0.07 tolgo 0.0000000001 e che 0.0700000001 e' ~ 0.07 se a 0.07 aggiungo 0.0000000001).

Quando vuoi visualizzare un numero a virgola mobile, arrotonda il numero.

Codice sorgente - presumibilmente Plain Text

  1. Var_ImportoTotale = Round(impv1 + impv2 , 2) 'Arrotonda a due cifre



Il mio blog: https://piero.dev
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:54
Martedì, 13/11/2012
Testo quotato


non capisco come risolvere il problema. :(



Premesso che *non* è un problema (vedi spiegazioni che già hai avuto) puoi risolvere in due modi

1) se vuoi usare comunque il Double allora devi solo "correggere" in visualizzazione scrivendo

Codice sorgente - presumibilmente Visual Basic 6

  1. Print Format(Var_ImportoTotale, "0.00000")



2) Usa il tipo di dato Decimal, molto più preciso del Double

Codice sorgente - presumibilmente VB.NET

  1. dim impv1 as Variant
  2. dim impv2 as Variant
  3. dim Var_ImportoTotale as Variant
  4.  
  5. impv1= CDec("3,64")
  6. impv2= CDec("-3,71")
  7.  
  8. Var_ImportoTotale = impv1 + impv2
  9.  
  10. Print Var_ImportoTotale




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
symonx80 (Normal User)
Pro


Messaggi: 107
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 8:12
Mercoledì, 14/11/2012
vi ringrazio

PM Quote