PDA

Visualizza versione completa : funzione di visual basic


Cucciolo
14-02-2004, 16.21.36
Ciao Amici!
qual'e' quella funzione di visual basic che
restituisce la parte decimale di un numero?

LoryOne
15-02-2004, 11.22.17
Mi pare che non esista ma la ricavi.

Sergio Neddi
15-02-2004, 21.47.20
Mah, io al massimo usavo il vecchio Qbasic oppure il Quick Basic 4.5.

Non mi ricordo più le funzioni, ma una maniera che mi viene in mente è, per esempio:

a=12.345 ' numero a caso
b=a-fix(a) ' calcola in b la parte decimale

Krakatau
16-02-2004, 17.10.39
Prova Mod 1...

cioè modulo uno...

Krakatau
19-02-2004, 09.46.45
prova così:




'-----------------------------------------------------------------------------------------------------------------------------------------
' Funzione di test per DecimalSide
'-----------------------------------------------------------------------------------------------------------------------------------------
Private Sub Command1_Click()

Dim b As Double
b = DecimalSide(3)

b = DecimalSide(3.14)


End Sub


'-----------------------------------------------------------------------------------------------------------------------------------------
' Funzione che restituisce la parte decimale di un double
'-----------------------------------------------------------------------------------------------------------------------------------------
Function DecimalSide(ByVal a As Double) As Double

Dim b As Double
Dim c As String

DecimalSide = 0
c = CStr(a)

For b = 1 To Len(c)
If (Mid(c, b, 1) = ",") Then
'decimale es.: 0,xxxxxxxx
DecimalSide = CDbl(Right(c, Len(c) - (b - 1)))

'solo parte decimale es.: xxxxxxxx
' DecimalSide = CDbl(Right(c, Len(c) - b))
Exit For
End If
Next b

End Function

LoryOne
19-02-2004, 12.08.27
Funziona ma scrivi un po troppo codice.

Non serve un ciclo For...To...Next, basta un Instr.
Quando usi Left,Mid,Right è preferibile (per questioni di velocità di esecuzione) utilizzare Lef$,Mid$,Right$ in quanto il valore restituito è di tipo stringa non variant.

La soluzione proposta da Neddi (Y) è la migliore e la più giusta come velocità di esecuzione.

a=12.345 ' numero a caso
b=a-int(a) ' calcola in b la parte decimale

Perchè Neddi ha usato Fix e non Int ? :rolleyes:

Sergio Neddi
19-02-2004, 21.08.31
Originariamente inviato da LoryOne
Funziona ma scrivi un po troppo codice.

Non serve un ciclo For...To...Next, basta un Instr.
Quando usi Left,Mid,Right è preferibile (per questioni di velocità di esecuzione) utilizzare Lef$,Mid$,Right$ in quanto il valore restituito è di tipo stringa non variant.

La soluzione proposta da Neddi (Y) è la migliore e la più giusta come velocità di esecuzione.

a=12.345 ' numero a caso
b=a-int(a) ' calcola in b la parte decimale

Perchè Neddi ha usato Fix e non Int ? :rolleyes:

Riporto dall'Help del Qbasic:


FIX tronca un'espressione a virgola mobile alla sua parte intera.
INT restituisce il numero intero più grande minore o uguale ad un'espressione
numerica.


Mi pare che per questo utilizzo sia più adatto FIX.

Inoltre in versioni più vecchie di Basic (dalle quali deriva Qbasic) la funzione INT gestiva numeri che potevano venire espressi con numeri interi (che erano 16 bit compreso segno), cioè manipolava i numeri in virgola mobile ma se la parte fissa era più grande di + o - 32 mila e fischia davano overflow (in quanto il valore ritornato da INT era un intero a 16 bit segno compreso).

Dato che a suo tempo mi sono trovato la fregatura che talvolta i valori da elaborare superavano questo limite e mi davano un bel overflow, ho imparato (quindi a mie spese) ad usare sempre FIX che andava bene dappertutto (difatti ritornava un valore in virgola mobile).

Lo so, parlo di roba vecchia, ma la mia esperienza si è fermata al Qbasic del DOS dopo aver passato i vari basic della Commodore, dell'MSX, MBasic (il Basic Microsofto per sistemi CP/M), nonché gli "antichi" Basic forniti con i primi PC, cioé il Basica ed il GWBasic.

Sicuramente nei linguaggi più moderni le istruzioni si saranno evolute e quindi queste mie considerazioni non avranno più alcun senso.

LoryOne
20-02-2004, 08.27.06
Provate questo semplice programmino :

Private Sub Command1_Click()
Dim a As Double

a = 12.345
b = a - Int(a)
MsgBox "Primo caso (Utilizzo di Int(x)):" & vbCrLf & "a=12.345" & vbCrLf & "b=a-int(a)" & vbCrLf & "Risultato : " & b
a = 12.65
b = a - Int(a)
MsgBox "Secondo caso (Utilizzo di Int(x)):" & vbCrLf & "a=12.65" & vbCrLf & "b=a-int(a)" & vbCrLf & "Risultato : " & b
a = -12.345
b = a - Int(a)
MsgBox "Terzo caso (Utilizzo di Int(x)):" & vbCrLf & "a=-12.345" & vbCrLf & "b=a-int(a)" & vbCrLf & "Risultato : " & b & " ASSURDO !"
a = -12.65
b = a - Int(a)
MsgBox "Quarto caso (Utilizzo di (Int(x)):" & vbCrLf & "a=-12.65" & vbCrLf & "b=a-int(a)" & vbCrLf & "Risultato : " & b & " ASSURDO !"
a = 12.345
b = a - Fix(a)
MsgBox "Quinto caso (Utilizzo di Fix(x)):" & vbCrLf & "a=12.345" & vbCrLf & "b=a-fix(a)" & vbCrLf & "Risultato : " & b
a = 12.65
b = a - Fix(a)
MsgBox "Sesto caso (Utilizzo di Fix(x)):" & vbCrLf & "a=12.65" & vbCrLf & "b=a-fix(a)" & vbCrLf & "Risultato : " & b
a = -12.345
b = a - Fix(a)
MsgBox "Settimo caso (Utilizzo di Fix(x)):" & vbCrLf & "a=-12.345" & vbCrLf & "b=a-fix(a)" & vbCrLf & "Risultato : " & b
a = -12.65
b = a - Fix(a)
MsgBox "Ottavo caso (Utilizzo di (Fix(x)):" & vbCrLf & "a=-12.65" & vbCrLf & "b=a-fix(a)" & vbCrLf & "Risultato : " & b
End Sub

Il perchè è una pura questione algebrica ;)

Sergio Neddi
20-02-2004, 13.26.14
Ok, stasera lo converto per Qbasic e provo (qui sono al lavoro e non ce l'ho).

Sergio Neddi
20-02-2004, 13.50.45
Sono riuscito a recuperare il Qbasic, ecco i risultati (dopo la necessaria conversione del programma):

Primo caso (Utilizzo di Int(x)):
a = 12.345
b=a-int(a)
Risultato : .3450003
Secondo caso (Utilizzo di Int(x)):
a=12.65
b=a-int(a)
Risultato : .6499996
Terzo caso (Utilizzo di Int(x)):
a=-12.345
b=a-int(a)
Risultato : .6549997 ASSURDO !
Quarto caso (Utilizzo di (Int(x)):
a=-12.65
b=a-int(a)
Risultato : .3500004 ASSURDO !
Quinto caso (Utilizzo di Fix(x)):
a=12.345
b=a-fix(a)
Risultato : .3450003
Sesto caso (Utilizzo di Fix(x)):
a=12.65
b=a-fix(a)
Risultato : .6499996
Settimo caso (Utilizzo di Fix(x)):
a=-12.345
b=a-fix(a)
Risultato : -.3450003
Ottavo caso (Utilizzo di (Fix(x)):
a=-12.65
b=a-fix(a)
Risultato : -.6499996

Come si può vedere i risultati marcati come assurdi sono quelli relativi all'utilizzo della funzione INT con valori di segno negativo.

Difatti, come dicevo sopra, ci sono differenze tra la funzione FIX e la INT. La FIX riporta la parte fissa di un numero, la INT arrotonda: se il numero è positivo apparentemente si equivalgono, se il numero è negativo invece questo viene arrotondato all'intero, ad esempio INT(4.5) da come risultato 4, INT(-4.5) da come risultato 5.

E questo è un altro motivo per usare la funzione FIX invece di INT.

Ci sono anche, in tutti i risultati, delle leggere differenze nei decimali rispetto ai valori impostati in origine, ciò dipende dal fatto che si tratta comunque di calcoli e quindi ci sono degli arrotondamenti dovuti alle routine di calcolo.

Sicuramente se usate VB anziché Qbasic i vostri risultati differiranno un pochino.

LoryOne
20-02-2004, 16.52.44
Spiegazione eccezionale (Y), infatti:

a=-12.65
b=a-int(a)

-12.65-(-13)= -12.65+13 = 0.35

a=-12.345
b=a-int(a)

-12.345-(-13)= -12.345+13 = 0.65

Cucciolo
20-02-2004, 21.22.12
Grazie a tutt x la collaborazione!