Newsgroup: it.comp.www.asp
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.

 (N* 100) - Int(N * 100)
[stracut]
scusami ma non è più facile utilizzare?
if N>=10 and N<100 then
    'il numero è a 2 cifre
else
    'il numero il numero non è 2 cifre
end if
;-)
-- 
ITHost (your host company)
Technical Manager
C. Paparelli (MCSE,MCSD,MCDBA)
http://www.ithost.ch


Scusami mi sono espresso male, che ha fino a due cifre decimali o che ne ha
di piů
-- 
Claudio P.

 Claudio P.
Secondo me hai scoperto un BUG del VBScript...
Non ha senso, infatti, che debba apparire quella differenza (anche se
minima) in quel calcolo.
Non è che per caso usi un Pentium 60 che aveva il bug nei calcoli
matematici?
Ciao
--
AZ [Microsoft .NET MVP]

 ha scritto nel messaggio
news:bg9oo8$mbr3v$2...@ID-192116.news.uni-berlin.de...


 
Perchè prima di programmare in un qualunque linguaggio un minimo di 
nozioni sulla rappresentazione dei dati non farebbe male... è detta in 
modo acido, ma vuole essere un consiglio.
I numeri non interi nel computer vengono rappresentati in base ad alcune 
codifiche standard con una parte di mantissa ed una di esponente. Questi 
numeri sono chiamati tradizionalmente numeri reali, ma con i reali 
dell'algebra non hanno nulla a che vedere.
Questo tipo di rappresentazione che permette di memorizzare nel computer 
numeri molto grandi o molto piccoli in "poco spazio" non garantiscono 
una buona "risoluzione"...soprattutto nel momento in cui due reali 
vengono usati per eseguire delle operazioni algebriche.
Quando è necessario rappresentare dei numeri con parte decimale ed 
assenza di errori di arrotondamento bisogna utilizzare accordimenti del 
tipo: usare degli interi e rappresentarli con parte decimale (quindi 
dividerli per una potenza di 10) solo in fase di output per l'utente.
Questo approccio è anche quello utilizzato nei database in cui a volte 
esiste un tipo currency: questo tipo utilizza la stessa rappresentazione 
utilizzata dagli integer solo usa più bit e dedica le ultime cifre a 
destra a rappresentare la parte decimale.
ciao,
d.

 di più
Allora, innanzitutto il metodo migliore per compiere operazioni di questo
tipo è trasformare il numero in stringa IMMEDIATAMENTE e compiere il
controllo vedendo quante cifre ci sono dopo il simbolo ",".
Niente operazioni o cose strane secondo me.
Per quanto riguarda invece il problema del 2.45.. non te lo so dire
proprio.. credo che derivi dal modo di trattare i numeri.
In pratica lui fa un'operazione tra un int e un double, dato che il fatto
che 2.45*100 sia 245 non lo fa diventare un INT (a quanto ne so).
Cmq non è l'unica anomalia riscontrabile nei compilatori.. ce ne sono altre
che non ricordo, ma devo dire che questa è notevole e difficilmente uno se
non la sa può arrivarci prima che accada il fattaccio!!!

 matematici?
Uso un P4, comunque su it.comp.lang.visual-basic mi hanno spiegato che
dovrebbe essere un problema di tipi di numeri.
Anche se in VBScript non si dichiarano i tipi in realtà "dietro" dovrebbero
esistesere e fare A* B dove a=100 e B=2,5 si moltiplica un Double per un
Intero.
Da quel che ho capito il problema dovrebbe essere che il numero che da
problemi (in questo caso 2,45 ma anche altri) rappresentato in binario a
singola o doppia precisione comunque non da perfettamente 2,45
-- 
Claudio P.