Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto precisione dopo la virgola con numeri bassi

Ciao a tutti e scusate se posto solo quando ho bisogno!!
Ma ho un altro problemino.
Innanzi tutto ringrazio tutti quanti mi hanno aiutato a risolvere il 
problema della stampa.
Questo è il problema che ho visto usando il programma che sto cercando di 
fare:
Mettendo:
in text1 il valore 125
in text2 il valore 6.19
in combo1 il valore 3
in combo2 il valore 20
e quindi facendo 125 * 6.19 = 773.75 - 3% = 750.54 * 20% = 150.11
Invece il risultato che mi da il programma è 150.00
????Come mai? Spero qualcuno mi aiuti a risolvere questo problema!!!! Grazie
Questo sotto è il codice che ho scritto per implementare tale operazione
    Dim importo As Double
    importo = Val(Text1.Text) * Val(Text2.Text)
    If Val(Combo1.Text) = 0 Then
        Label1.Caption = Format$((Round(importo, 2)), "#0.00")
    Else
        Label1.Caption = Format$((Round((importo - (importo * 
Val(Combo1.Text) / 100)), 2)), "#0.00")
    End If
        Label2.Caption = Format$((Round((Val(Label1.Caption) * 
Val(Combo2.Text) / 100), 2)), "#0.00")


Non ho provato il codice però forse se usi CDbl anzichè Val potresti
risolvere il problema.
William.

 Val(Combo2.Text) / 100), 2)), "#0.00")
In realtà hai omesso di dire la cosa più importante, ossia che fai passare
l'importo 'attraverso' una label.
Questo è notevolmente sfigato, in quanto utilizzi in scrittura una funzione
localizzata (Format$), e in lettura una funzione delocalizzata (Val).
Devi scegliere una o l'altra delle due strade. Mescolare funzioni locali e
funzioni delocalizzate è sempre ad alto rischio casini.
La soluzione più banale (oltre a quella più corretta di memorizzare i valori
intermedi in variabili e non usare la label nei calcoli), è usare in
scrittura il Format$ e in lettura il CDbl (che è una funzione locale).
Ciao
Alberto
--
E tutto mi sembrava andasse bene...

 ha scritto nel messaggio 
news:L0gyd.38202$Zk.7...@twister2.libero.it...


 ha scritto nel messaggio 
news:32th2iF...@individual.net...


 scrittura il Format$ e in lettura il CDbl (che è una funzione locale).
[...CUT...]
Scusa l'ignoranza Albe (...mi sento piccolo piccolo...), ma cosa vuol dire
funzione "locale" o "delocalizzata"? E come si distingue se una funzione è
locale o delocalizzata?
Io non uso mai Val, e ovviamente anch'io avrei usato CDbl, ma dopo la tua
spiegazione mi accorgo che c'è qualcosa di importante che non so.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 tua spiegazione mi accorgo che c'è qualcosa di importante che non so.
Direi che è una cosa fondamentale, e la sua non conoscenza porta a bug
apparentemente inspiegabili.
Il punto è:
Esistono funzioni il cui comportamento varia a seconda delle impostazioni
locali del sistema. Queste io le chiamo "Funzioni Localizzate".
Esistono funzioni il cui comportamento *non* varia a seconda delle
impostazioni locali del sistema. Queste io le chiamo "Funzioni
Delocalizzate".
Val è DElocalizzata.
Ossia, Val("1.2") restituisce SEMPRE 1.2 (unoeduedecimi), che ci si trovi in
un sistema ITA, ENG, USA, FRA, ecc...
Parimenti, Val("1,2") restituisce SEMPRE 1 (unosenzadecimi), in qualunque
sistema.
CDbl è Localizzata.
Ossia, CDbl("1.2") restituisce 1.2 (unoeduedecimi) in un sistema ENG, mentre
dà errore in un sistema ITA.
Parimenti, CDbl("1,2") dà errore in un sistema ENG, mentre restituisce 1.2
(unoeduedecimi) in un sistema ITA.
Ma il caso del nostro amico era estremamente intricato, perchè in un sistema
ENG avrebbe funzionato, mentre in un sistema ITA dava l'anomalia che
riportava.
Il passaggio era:
Variabile=Val("1.2") << e questo è delocalizzato, quindi OK,
variabile=unoeduedecimi
Label.Caption=Format$(Variabile,"0.00") <<e questo è localizzato, per cui
nella caption appare "1,2", nota bene, con la VIRGOLA e non con il punto.
Variabile=Val(Label.Caption) <<e questo è nuovamente DElocalizzato, ma a
questo punto il Val trova un carattere non valido (la virgola), e smette di
interpretare dopo l'unità, quindi variabile=unoenessundecimale.
Usando invece il CDbl nell'ultimo passaggio (attenzione, l'uso nel primo
passaggio è a scelta, dipende se si vuole consentire una digitazione
localizzata o meno all'utente), abbiamo sia la scrittura nella caption (col
Format$), sia la lettura della caption (col CDbl) entrambe localizzate. La
virgola è quindi un carattere valido (visto che il sistema è ITA), e tutto
funziona.


 [SNIP]
A fianco a quanto ottimamente (come sempre) detto da Alberto, vorrei 
aggiungere un paio di cose.
CDbl converte l'espressione in "numero a virgola mobile" la cui 
rappresentazione in memoria porta spesso ad approssimazioni "inaspettate". 
Per una precisione "corretta", se ci si puo' accontentare di sole 4 cifre 
decimali dopo la virgola, si puo' optare per il tipo di dati Currency 
(vengono comunque usate 5 cifre per i calcoli) la cui funzione di 
conversione e' CCur.
Altra precisazione va fatta sulla funzione Round in VB, che fa 
l'approssimazione "bancaria" (ovvero approssima al numero dispari piu' 
vicino) e non "matematica" per la quale invece va usata FormatNumber.
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org


OK, grazie a entrambi per le spiegazioni, e scusate se non ho risposto ieri
(causa organizzazione cena di Natale).
Sapevo qualcosa di questo, e comunque c'era scritto anche nell'help il
riferimento alla localizzazione del SO. Comunque io ho sempre usato le API
per determinare la versione locale, e dopo i vostri speech starò doppiamente
attento con CDbl. Grazie e Buone Feste.
