Newsgroup: it.comp.lang.visual-basic
Titolo: [?]curiosità su int()

Il seguente codice
private sub Command1_click()
dim dVar as double
dim iVar as integer
    dvar = 36.15
    msgbox dvar
    ivar = int(dvar * 100)
    msgbox ivar
    ivar = cint(dvar * 100)
    msgbox ivar
exit sub
produce valori di iVar diversi (solo il secondo č corretto).
Sbaglio qualcosa io, pensando che anche la prima istruzione (quella coll'
int(), per intenderci) debba dare comunque come risultato 3615, oppure č
ulteriormente confermata la teoria "Lupo" (in MS bevono) ?
Grazie in anticipo.
Salutoni
Sergio

 ha scritto nel messaggio
news:uAxp9.40720$cS4.1...@news2.tin.it...

Il concetto base č: Int e Cint sono funzioni diverse:
Int restituisce la parte intera del numero, mentre CInt converte fra tipi.
Quindi, CInt effettua una conversione fra tipi, cercando di avvicinare
l'intero piů vicino (e quindi umanamente č piů logico), mentre Int 'tronca'
il numero.
Quindi, Int(14.999999)=14, mentre CInt(14.999999)=15
Ma questo non č un errato comportamento, č insito nelle caratteristiche dei
tipi.
Il Double, come noto, č un tipo che garantisce la massima precisione in
notazione binaria, ma nella conversione in decimale (per la visualizzazione
umana), subisce calcoli che non necessariamente restituiscono quanto atteso.
Ad ogni esigenza il suo tipo: se devi memorizzare importi o valori con poche
cifre decimali, sicuramente meglio il long, l'int, o il Currency (ad
esempio, mettendo Dim dVar As Currency anzichč double), presumo tu risolva
tutto.
Ciao
Alberto

 tutto.
Oppure, nel caso di moltiplicazioni simili a quella vista, e' sufficiente
assegnare il risultato del calcolo ad una variabile Double temporanea e
applicare solo al risultato finale le funzioni di conversione.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 dVar * 100
dovrebbe già dare un risultato "intero", nell'esempio sopra indicato, per
cui troncandolo dovrebbe comunque dare un risultato corretto...
Tanto più che, sempre considerando i valori dell'esempio, se io faccio
dvar =36.15
dvar = dvar * 100
ivar = int(dvar)
msgbox ivar
mi visualizza 3615
ripeto, la cosa mi perplime parecchio.
Posso capire che l'impostazione
 ivar = int(dvar * 100)
non sia il massimo quanto a rigorosità di codifica, ma comincio a pensare
che lupo abbia ragione....
Salutoni
Sergio

 scontata...
Anzi, e' un malcostume indotto dai cast impliciti di visual basic,
facendo perdere il controllo della situazione al programmatore.
--
ciao, hal
--------------------------------
Inviato via 
http://usenet.libero.it

 facendo perdere il controllo della situazione al programmatore.
Ancora una nota carina su CLng()|CInt()|Round().
Queste usano l'arrotondamento bancario sul .5 (detto anche "uno su uno
giů"):
1.5 -> 2 eccesso
2.5 -> 2 difetto
3.5 -> 4 eccesso
4.5 -> 4 difetto
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

giů"):
Giusto richiamo a quanto piu' volte dibattuto su questo ng :-)
La morale e' che CLng e CInt vanno usati per quello che sono,
cioe' per convertire da un tipo di dato al' altro e non per arrotondare.
Per troncare esistono Int e Fix (sulla guida i dettagli delle differenze).
Per arrotondare conviene scriversi una propria funzione di arrotondamento,
per non farsi imbrogliare da quella fornita da vb (ma gli sarebbe costato
cosi' tanto fornire un terzo argomento per la direzione dell' arrotondamento?)
-- 
ciao, hal