Newsgroup: it.comp.lang.visual-basic
Titolo: problemi con INT/FIX

devo ottenere la parte intera di un numero ed  ho notato questo
problema:
se
pvNumero = 10000.12345
plMoltiplicatore = 10^5
questo:
pvNumero * plMoltiplicatore =>  1000012345
mentre
Int(pvNumero * plMoltiplicatore) => 1000012344
qualcuno sa come ovviare a questo problema?
Grazie
Daniele

 Int(pvNumero * plMoltiplicatore) => 1000012344
è la solita questione della gestione dei numeri in virgola mobile.
molto probabilmente quel 1000012344 è in realtà 1000012344,999987, ma la
funzione int tronca di brutto tutto ciò che si trova dopo la virgola.
Dovrebbe esserci, da qualche parte, una funzione round, oppure potresti usare il
clng
--
Salutoni
Sergio


ho utilizzato CDec per la moltiplicazione..
grazie cmq


Beh, devi decidere tu cosa vuoi.
Usando INT, hai scelto una funzione che, come documentato, 'tronca' i
decimali.
Se quello che vuoi č che il double, risultante dalla moltiplicazione, venga
arrotondato al valore intero (come noi umani lo intendiamo, non Integer) piů
vicino, la funzione piů corretta č Round (se vuoi conservare il double) o
CLng (se preferisci passare al Long).
Ciao
Alberto

 funzione int tronca di brutto tutto ciò che si trova dopo la virgola.
ho fatto altri controlli: la moltiplicazione ritorna il valore giusto. è INT/FIX che
fallisce.
potrei utilizzare Round, ma al momento non so se mi potrebbe generare errori logici
..
il probl. rimane ste c.... di fix........

 giusto. è INT/FIX che fallisce.
Ma non diciamo c.......
Questo è un argomento che è uscito talmente tante volte che mi rifiuto di
tornarne a parlare.
Private Sub Command1_Click()
Dim pvNumero As Double
Dim plMoltiplicatore As Double
pvNumero = 10000.12345
plMoltiplicatore = 10 ^ 5
If pvNumero * plMoltiplicatore = 1000012345 Then
    Debug.Print "OK"
Else
    Debug.Print "Oooopppsss"
End If
Debug.Print CStr(pvNumero * plMoltiplicatore)
Debug.Print CStr(Int(pvNumero * plMoltiplicatore))
Debug.Print CStr(CLng(pvNumero * plMoltiplicatore))
End Sub
Ciao
Alberto


questo è il mio risultato:
Oooopppsss
1000012345
1000012344
1000012345
vedi che è FIX??!!!!!!!!!!!!!!!!!!!!

 vedi che č FIX??!!!!!!!!!!!!!!!!!!!!
Stai scherzando, vero?
Alberto

 vedi che č FIX??!!!!!!!!!!!!!!!!!!!!
Ti vengo incontro....
Private Sub Command1_Click()
Dim pvNumero As Double
Dim plMoltiplicatore As Double
pvNumero = 10000.12345
plMoltiplicatore = 10 ^ 5
If pvNumero * plMoltiplicatore = 1000012345 Then
    Debug.Print "OK"
Else
    Debug.Print "Oooopppsss"
End If
If pvNumero * plMoltiplicatore < 1000012345 Then
    Debug.Print "Check my brain is connected before posting"
Else
    Debug.Print "E' un problema di INT/FIX"
End If
Debug.Print CStr(pvNumero * plMoltiplicatore)
Debug.Print CStr(Int(pvNumero * plMoltiplicatore))
Debug.Print CStr(CLng(pvNumero * plMoltiplicatore))
End Sub
Ciao
Alberto


magari non ci arrivo io.... ma che senso ha che la funzione CStr(primo
caso) fa funzionare le cose?

 caso) fa funzionare le cose?
La funzione CStr è quella che viene eseguita ogni volta che tu fai, ad
esempio:
Text1.Text=a*b
ossia quando assegni una variabile NON string ad una proprietà di tipo
String.
Riprendiamo un attimo il codice:
Private Sub Command1_Click()
Dim pvNumero As Double
Dim plMoltiplicatore As Double
pvNumero = 10000.12345
plMoltiplicatore = 10 ^ 5
If pvNumero * plMoltiplicatore = 1000012345 Then
    Debug.Print "OK"
Else
    Debug.Print "Oooopppsss"
End If
If pvNumero * plMoltiplicatore < 1000012345 Then
    Debug.Print "Check my brain is connected before posting"
Else
    Debug.Print "E' un problema di INT/FIX"
End If
Debug.Print CStr(pvNumero * plMoltiplicatore)
End Sub
e riscriviamolo, esattamente come viene eseguito, ossia aggiungendo le
conversioni implicite, anche da compilazione:
Private Sub Command1_Click()
Dim pvNumero As Double
Dim plMoltiplicatore As Double
pvNumero = CDbl(10000.12345)
plMoltiplicatore = CDbl(10 ^ 5)
If pvNumero * plMoltiplicatore = CDbl(1000012345) Then
    Debug.Print "OK"
Else
    Debug.Print "Oooopppsss"
End If
If pvNumero * plMoltiplicatore < CDbl(1000012345) Then
    Debug.Print "Check my brain is connected before posting"
Else
    Debug.Print "E' un problema di INT/FIX"
End If
Debug.Print CStr(pvNumero * plMoltiplicatore)
End Sub
Noti quanti CDbl ci sono?
Bene, ognuno di quei passaggi introduce inevitabilmente un arrotondamento,
nella conversione fra notazione decimale (comoda per te, ma che per il PC
non ha senso) e notazione binaria con virgola (che è quella usata dal PC).
Eseguendo la moltiplicazione, gli arrotondamenti avvenuti nei primi CDbl si
moltiplicano fra loro, ottenendo un arrotondamento (rispetto alla tua
visione decimale), ovviamente diverso dall'arrotondamento che avviene nel
CDbl nelle due espressioni di confronto (negli If, per intenderci).
Quindi, quando alla fine esegui un CStr (che, ripeto, sarebbe avvenuto in
maniera implicita, ma io l'ho scritto per correttezza e nella speranza che
tu seguissi il giochetto, visto che questo che ti sto scrivendo è una cosa
spiegata e rispiegata qualche migliaio di volte nel NG), il PC effettua una
conversione fra un valore binario con virgola e una notazione decimale per
l'essere umano.
E qui, quando le posizioni decimali di arrotondamento sono molto lontane
dall'unità, la funzione 'capisce' che occorre un po' di comprensione, e
arrotonda la visualizzazione.
Altri dettagli, se cerchi nei post passati, a volontà..
Ciao
Alberto