Sottrazione



  • Sottrazione
    di Mangusta (utente non iscritto) data: 12/07/2013 12:44:35

    Ciao a tutti!
    Tramite vba faccio fare la sottrazione tra una serie di numeri il risultato pero invece di essere zero come DEVE essere è
    -1,77635683940025E-15

    se cambio formato appare 0,00 o 0 ma non riconosce il contenuto della cella come zero
    esempio
    8,65-8,65=-1,77635683940025E-15

    consigli?



  • di paolomath data: 12/07/2013 14:47:19

    Ciao,

    la variabile (o le variabili) che elabori sono dichiarate come Single o Double o Decimal?

    Potrebbe essere un erore legato all'approssimazione dei calcoli...



  • di Vecchio Frac data: 12/07/2013 15:04:24

    cit. " Potrebbe essere un errore legato all'approssimazione dei calcoli..."
    ---> Togli pure il "potrebbe", inoltre non è un errore ma un problema di visualizzazione (il numero è memorizzato internamente con una precisione che viene approssimata a zero ma non lo è, e la piccolissima differenza salta fuori quando si fanno i calcoli).
    Dimensionando la variabile di destinazione come Long (che rappresenta numeri interi) non dovrebbero esserci problemi.




  • Sottrazione
    di Santuberto (utente non iscritto) data: 12/07/2013 15:39:58

    Forse è lo stesso problema trattato in "strana somma", iniziata dal sottoscritto il 17.02.11 Cordiali saluti



  • di paolomath data: 12/07/2013 15:49:52

    L'impostazione della variabile di destinazione come Long non risolve il problema a meno che la somma debba sempre fare 0.

    Dim a as long

    a=4/5

    Assegna ad a il valore di 1, ma a=0,8



  • di Mangusta (utente non iscritto) data: 15/07/2013 10:55:44

    ho copiato frammento di codice! non c'è variabile destinazione ma una cella

     
     If cella.Offset(0, 11).Value <> .Cells(x.Row, 11) Then
                                
                               cella.Offset(0, 14) = .Cells(x.Row, 10) - cella.Offset(0, 9) 
                                cella.Offset(0, 15) = .Cells(x.Row, 11) - cella.Offset(0, 10)
                                cella.Offset(0, 16) = .Cells(x.Row, 12) - cella.Offset(0, 11) 



  • di Vecchio Frac data: 15/07/2013 13:35:08

    cit. "L'impostazione della variabile di destinazione come Long non risolve il problema a meno che la somma debba sempre fare 0.
    Dim a as long
    a=4/5
    Assegna ad a il valore di 1, ma a=0,8"

    ---> Uhm no, non sono d'accordo. Una variabile dimensionata Long è e rimane intera (viene fatta una conversione di tipo per cui i frazionari diventano interi arrotondati). Nell'esempio citato, il risultato intero dell'operazione 4/5 (0,8) viene assegnato ad "a" e poichè "a" è di tipo Long viene arrotondato a 1.

    A Mangusta consiglio di effettuare una conversione esplicita prima di assegnare alla cella.
     
    If cella.Offset(0, 11).Value <> .Cells(x.Row, 11) Then                       
        cella.Offset(0, 14) = CLng(.Cells(x.Row, 10) - cella.Offset(0, 9) )
        cella.Offset(0, 15) = CLng(.Cells(x.Row, 11) - cella.Offset(0, 10))
        cella.Offset(0, 16) = CLng(.Cells(x.Row, 12) - cella.Offset(0, 11))






  • di Mangusta (utente non iscritto) data: 15/07/2013 14:54:26

    Wow la conversione esplicita mi mancava!!



  • di Mangusta (utente non iscritto) data: 17/07/2013 13:01:15

    Cosi perdo i decimali! sto variando con integer double ecc ma rimane l'arrotondamento!!!



  • di Vecchio Frac data: 17/07/2013 13:54:31

    CDbl al posto di CLng forse non l'hai provato ^_^





  • di Mangusta (utente non iscritto) data: 18/07/2013 17:12:08

    Si provato ma non funziona!! uff non so che far!!!



  • di paolomath data: 18/07/2013 22:41:08

    cit. "il risultato pero invece di essere zero come DEVE essere", perchè dovrebbe essere?

    Qunado fai: cella.Offset(0, 14) = .Cells(x.Row, 10) - cella.Offset(0, 9) cosa c'è nelle due celle che sottrai?