Newsgroup: it.comp.lang.visual-basic
Titolo: non sono pazzo

Avevo da fare un controllo su un numero per verificare se fosse o meno di
due cifre ho optato per questa soluzione:
(N* 100) - Int(N * 100)
dove N č il numero che voglio controllare, se il risultato č differente da 0
N ha piů di due cifre decimali e quindi lo blocco.
Tutto funzionava finchč in N non č finito 2,45 (e un altro numero che ora
non ricordo ma che sto chiedendo) avendo due cifre decimali il numero doveva
passare e invece lo bloccava .....allora mi sono fatto spamare i valori:
Response.Write (2.45 * 100) & "-"
Response.Write Int(2.45 * 100) & "="
Response.Write (2.45 * 100) - Int(2.45 * 100)
il rilutato che mi viene sulla pagina č questo
245-
245=
2,8421709430404E-14
Praticamente il risultato di questa operazione non č 0 ma bensi
0,000..........0002842...
Per il programma non c'č problema perchč ho trovato un'altra soluzione ma mi
piacerebbe capire perchč succede questo, da notare che se sostituisco 2.45
con altri numeri con qualsiasi numero di decimali il risultato che torna č
GIUSTO ......mentre con 2.45 mi da questo problema .....so che č successo
anche con un altro numero e sto cercando di farmi dire quale era per vedere
se c'č una relazione.
Aggiungo che siccome scrivendo:
Response.Write 245 & "-"
Response.Write Int(2.45 * 100) & "="
Response.Write 245 - Int(2.45 * 100)
il risultato č:
245-
245=
0
Quindi il problema č nella prima parte dell'espressione perchč sostituendo
(2.45 * 100)  con 245 il risultato č GIUSTO
infatti se scrivo:
Response.Write (2.45 * 100) & "-"
Response.Write 245 & "="
Response.Write (2.45 * 100) - 245
il risultato č nuovamente:
245-
245=
2,8421709430404E-14
-- 
Claudio P.

 Response.Write (2.45 * 100) - 245
Response.Write int(2.45*100)-int(2.45*100)
è l'unica cosa che non hai provato perchè?
Alessandro
-- 
Morfeus

 Response.Write (2.45 * 100) - 245
essendo il 2.45 un double non ha una "precisione finita",
quindi ottieni quel valore, io ho risolto in questo modo
if round(n,2)=round(n,4) then
    'ha meno di due cifre decimali
te pias?
MIk

 spamare i valori:
Tutto ciň ha un senso solo per tipi di dati a virgola fissa, come Long,
Integer, Currency. Assolutamente non ha senso per tipi Single e Double.
A seconda delle tue esigenze, avrai usato un tipo o un altro.
Se mi dici di che tipo č N, vediamo di capire cosa vuoi e come ottenerlo.
Ciao
Alberto

 2,8421709430404E-14
Stai sottrendo un integer (245) a un double (2.45 * 100)  con le
approssimazioni del caso.
Anche se in notazione esponenziale decimale 2.45 è un semplice 2.45*10^0 in
notazione esponenziale binaria potrebbe anche essere un numero di 100 cifre
con relativa perdita di precisione (visto che il numero di bit della
mantissa è fisso).
VBscript non ti consente di tipizzare le variabili, ma le funzioni di
conversione ci sono.
termoPilucco.

 due cifre...
if (log(x) / log(10)) < 2 then ....
Giusto per scomodare qualche vecchia nozione di matematica :-)
-- 
Ciao, Mauro CB

 te pias?
Molto, metodo sicuramente migliore dei miei .....grazie
-- 
Claudio P.

Grazie a tutti per le spiegazioni
-- 
Claudio P.

 (N* 100) - Int(N * 100)
' Considerando che il punto decimale sia la virgola:
NDec = Len(CStr(n)) - InStr(CStr(n), ",")
Ciao

 if (log(x) / log(10)) < 2 then ....
... che non c'entra niente con quello che voleva fare Claudio.
-- 
Ciao, Mauro CB.

 ... che non c'entra niente con quello che voleva fare Claudio.
In effetti quello che hai scritto corrisponde a
if x<100 then
con in aggiunta problemi per x<=0 :)
termoPilucco.


scusa non facevi prima a fare il len(N)??

scusa non facevi prima a fare il len(N)??
La tua proposta in vb funziona perche' avviene la conversione
implicita in stringa.
Quello che suggerisci e' in realta':
	Len(CStr(N)
-- 
ciao, hal


E' abbastanza chiaro che N è una variabile numerica.
Fare il Len di una variabile numerica, oltre ad essere una porcata
stilistica di primissimo livello, presenta diversi casi in cui non
restituisce ciò che si cerca.
ciao
Alberto

 restituisce ciò che si cerca.
tu ti confondi con la funzione (lenB)
la funzione (len) tratta tutto sempre come una stringa, quindi mi sembra
giusto.

 sembra giusto.
Contento tu...
Ciao
Alberto

	Len(CStr(N)
A parte i commenti sulla proposta ...
Es.:
    Dim n As Single
    n = 100.4565
    Debug.Print Len(n)
Ottengo sempre 4 ovvero (se non erro) la dimensione in byte del tipo
di dato usato.
Ciao!

 di dato usato.
sei troppo un fenomeno, io ho avuto una distrazione di principio, non ho
ribadito
perche hal1961 mi ha corretto.
tuttavia se abbiamo un variabile numerica bisogna fare come è stato detto
len(cstr(n))
prova a fare cosi nel  tuo progettino.:-)

prova a fare cosi nel  tuo progettino.:-)
Volevo soltanto sottolineare il fatto che il Len su una variabile
numerica non effettua una conversione implicita a stringa.
Ciao!

 prova a fare cosi nel  tuo progettino.:-)
Adesso che ti sei accorto anche tu dell'errore, prova a spiegare in che modo
il Len possa servire a determinare se un numero ha due cifre decimali o
meno.
Per carità, ci si salta fuori, ma ci si deve incastrare in una contorsione
di InstrRev basata sulle impostazioni locali, che sinceramente non ne vedo
l'utilità.
ciao
Alberto


allora scusa , devo avere capito male tutto il post, cmq
domanda iniziale:
Avevo da fare un controllo su un numero per verificare se fosse o meno di
due cifre
o due decimali??
non mi sembra parlasse di decimale...per lo meno nel post di inizio.
ciao

 non mi sembra parlasse di decimale...per lo meno nel post di inizio.
Si scusate forse mi sono espresso male, inendevo sapere se i decimali erano
due o più di due
-- 
Claudio P.