Newsgroup: it.comp.lang.visual-basic
Titolo: Sottrazioni con numeri errati

Dunque o sto flippando io ... o il mio pc
dim a as variant
dim b as variant
dim x as variant
a = 99999999.99
b = 100999999.99
x = b - a
risultato dovrebbe essere 1.000.000
invece mi da 100.000.000
Diamo i numeri ... ????
Ciao
Andrea

 ha scritto nel messaggio
news:artddc$la9ia$1...@ID-61006.news.dfncis.de...

si :))
sembra il classico problema da impostazioni internazionali....
il tuo risultato è moltiplicato per 100 perchè il punto viene ignorato....
--
bye BlackMagic
ICQ#:85485468

 il tuo risultato č moltiplicato per 100 perchč il punto viene ignorato....
Ma nel codice VB credo che le impostazioni internazionali non contino.
Per cui, se nel codice scrivo A=123.456 il punto deve essere sempre
considerato come separatore dei decimali, indipendentemente dalle
impostazioni internazionali.
Ciao
Alberto

 invece mi da 100.000.000
A me da 1.000.000 con VB
Invece 999999.91 con una calcolatrice non troppo precisa sugli 
arrotondamenti !
ciao

 dim x as variant
Copia e incolla del tuo codice in un prog vuoto:
Private Sub Command1_Click()
    Dim a As Variant
    Dim b As Variant
    Dim x As Variant
    a = 99999999.99
    b = 100999999.99
    x = b - a
    Debug.Print x ' riga aggiunta da me
End Sub
Risultato:
********
1000000
********
A me gli zeri sembrano 6, che t'aggia di'... :-(
Win95 VB5 SP3
Bye, G.

 ha scritto nel messaggio
news:artddc$la9ia$1...@ID-61006.news.dfncis.de...

ci riprovo....
copia/incolla il tuo esempio il risultato è
1.000.000
per aver 100.000.000
mi tocca fare:
a = "99999999.99"
b = "100999999.99"
x=b-a --> 100.000.000
vedi un pò te....


> Ma nel codice VB credo che le impostazioni internazionali non contino.
Contano invece!
Prova a mettere una texbox su un form
Poi dichiara una variabile come currency e memorizzaci dentro 10,32
Se hai impostato LIRE nelle impost. internazionali ti verrà fuori nella
texbox L. 10 (o al massimo L. 10,32 se hai le due cifre decimali)
Invece se imposti EURO ti viene fuori il caro simboletto ? 10,32

 Poi dichiara una variabile come currency e memorizzaci dentro 10,32
Se intendi una cosa tipo:
Dim a as Currency
a=Text1.text
ho già postato perchè una cosa del genere è da aborrire come la peste.
Ciao
Alberto


Dim a as Currency
a=10,32
Text1.Text=a

 ha scritto nel messaggio
news:SKsE9.20944$3l.5...@twister1.libero.it...

Scusa, vuoi dire che nel tuo VB una cosa del genere funziona?
Comunque, ammettendo che il tuo esempio fosse in realtà
Dim a as Currency
a=10.32
Text1.Text=a
questo è proprio quello che ho appena postato, nel thread "? minuti senza lo
zero", come esempio di pessima programmazione.
Rifletti su questo:
Text1.Text è una stringa, giusto?
a è un currency, quindi un numerico, giusto?
Allora
Text1.Text=a
cos'è?
Te lo dico io: un poccio.
Vb, nella sua immensa bontà, capirà che il programmatore è un newbie, e
modificherà il codice in
Text1.Text=cstr(a)
risolvendo così il conflitto di tipi, ma togliendo dal tuo controllo la
conversione.
Usando invece, correttamente, il format$, si risolve il conflitto di tipi
mantenendo il controllo del flusso del dato.
Ciao
Alberto

 dim x as variant
ricominciamo cosě:
dim a as single        ;-)
ciao
ugo

 dim a as single        ;-)
Io mi ero astenuto...
Un Paperino "e allora Option Explicit dove lo mettiamo ?".

 Un Paperino "e allora Option Explicit dove lo mettiamo ?".
Giusto.
Ricominciamo così:
Option explicit         :-PPP*
(e poi si parla di WINzozz...)
ciao
ugo
* Errore di compilazione.
   previsto: fine istruzione
ri- ;-PPP

Il problema è che ... scoperto ora ... gli arriva dentro un
valore in formato stringa ... assurdo.
Provate a fare a = "99999999.99"
e b = "100999999.99"
vedete che viene fuori.
ciao
andrea


Abbiamo capito.
Il punto è che _non devi usare un variant_ per
un'operazione del genere.
Imho non devi usare un variant _e basta_ comunque...    ;-)
ciao
ugo

 vedete che viene fuori.
Questo è un codice diverso da quello che avevi postato all'inizio.
Che tu stessi confondendo stringhe con numeri era già stato capito e
postato.
Ciao
Alberto

 ha scritto nel messaggio
news:LlGE9.23848$2B1.6...@twister2.libero.it...

quello che sta facendo è obbligare vb ad eseguire una conversione
fra tipi, in questo caso la stringa "99999999.99" viene "convertita"
nel numero 9999999999 e così "100999999.99" viene convertito
nel numero 10099999999 e poi vb esegue l'operazione richiesta
mentre "99999999,99" verrebbe convertito in 99999999.99
a questo punto credo che queste "conversioni" avvengano in modo diverso in
base alle impostazioni internazionali e che Andrea farebbe meglio ad
evitarle
per non incorrere in comportamenti "anomali" e in errori difficilmente
individuabili
correggimi se sbaglio...


 correggimi se sbaglio...
Non sbagli.
Nel mio post di ieri, a cui facevo riferimento in questo thread:
Questo è male, tutte le conversioni implicite sono male.
Non soltanto per performance o compatibilità con altre cose, ma proprio
perchè, non abituandosi ad esplicitare le conversioni, ci si inchioda di
fronte a qualunque cosa, per non parlare di tutti i bug che risultano
'incomprensibili', e che nascono semplicemente perchè non si è convertito
esplicitamente un tipo.
Ciao
Alberto

 esplicitamente un tipo.
mmm... tipico caso di "autocitazione"   ;-)
ciao
ugo