Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 - Problematiche arrotondamento MSHFlexGrid

Ciao a tutti.
Ho un problema quando popolo una MSHFlexGrid con un recordset
proveniente da una tabella con dei campi numerici a precisione
singola.
La MSHFlexGrid su questi campi AGGIUNGE delle cifre decimali non
presenti nella tabella di origine
La tabella è fatta in MSACCESS - tipo numerico - Precisione singola.
Tutti i valori delle colonne numeriche hanno al massimo una cifra
decimale.
Quando visualizzo i dati con Access va bene.
Lo stesso va bene quando uso una datagrid.
Ma se uso la mshflexgrid, ottengo dei valori fantasiosi
tipo 72.1 diventa 72.099998
ecc ecc
Allego una immagine chiarificatrice.
http://xs.to/xs.php?h=xs231&d=08401&f=problematiche_mshflexgrid346.jpg
Il formato dei campi Acqua e Proteine è esattamente lo stesso.
Che posso fare?
grazie a tutti.
sam--

 ecc ecc
Se hai usato valori in virgola mobile, non ha senso che tu ne esiga la 
perfezione in ambito decimale.
Sono due 'mondi' diversi, ciascuno con le sue peculiarità.
Il virgola mobile può rappresentare numeri enormi e numeri enormemente 
piccoli, ma non è congruente con la visione decimale 'umana' sui numeri 
ordinari. La memorizzazione decimale è perfetta per noi umani, ma non 
arriva agli estremi del range dei numeri.
A seconda di cosa tu debba rappresentare con quella colonna, devi usare 
un virgola mobile o un virgola fissa.
Ciao
Alberto
-- 
Georges Pompidou: Un uomo di stato è un politico che dona se stesso al 
servizio della nazione. Un politico è un uomo di stato che pone la 
nazione al suo servizio.

 Che posso fare?
La popoli a mano la griglia o è bounded? Comunque mi pare ci sia il data
format.
Ad esempio per vedere sempre due decimali puoi fare:
Format$(Rs.Fields("QTA").Value,"0.00")

Il 29/09/2008, Andrea [Work] ha detto :

Comunque sarebbe una pezza.
L'OP ha scritto: "La MSHFlexGrid su questi campi AGGIUNGE delle cifre 
decimali non presenti nella tabella di origine", il che è ovviamente 
falso.
La Grid non aggiunge alcun decimale, è piuttosto il client di Access a 
'nascondere' la cosa.
Ma se nella colonna è memorizzato 72.099998 anzichè 72.1, e questo 
valore viene utilizzato in qualche calcolo o in qualche confronto, le 
anomalie proseguirebbero e diventerebbero anzi meno individuabili.
Io ragionerei sul perchè un dato in virgola mobile quando si richiede 
una precisione decimale anzichè floating.
Ciao
Alberto
-- 
Fabio Fazio: Se siamo alleati come mai nei nostri bar si vende Coca 
Cola e nei bar americani non si vende l'amaretto di Saronno?

 una precisione decimale anzichè floating.
Bhe è vero, è che mi capita di avere dei campi che a seconda di quale
recordo corrispondono, possono assumere valori differenti.
Nel lavoro normale, i calcoli si fanno in un modo e seguendo delle regole,
poi i decimali in visualizzazione può variare.
Anche se sono sempre decimali, pensa che un gestionale lo usa uno che fa
fili di ferro, ed uno che vende oro.
Ad uno servono molti decimali per definire il prezzo al metro, all'altro è
più probabile che servano più decimali sulla quantità.
Comunque si, prima ci sarebbe da capire come mai ci sono quei valori e se
servono.

 servono.
Assolutamente. Inutile nascondere la polvere sotto il tappeto con 
Format o personalizzando i DataFormat delle griglie, dei textbox, dei 
report, ecc...
Comunque la settimana scorsa ho emesso 3 riba on-line con Unicredit 
Corporate.
Prima riba 1234.56, seconda riba 2345.67, terza riba 3456.78
Totale: 7037.009999999999999 (e purtroppo ho dato 'avanti' prima di 
fare un printscreen)...
Quindi l'OP è in buona compagnia...
Alberto
-- 
La bellezza è opinabile, sulla bruttezza sono tutti d'accordo.

 determisticamente annullabili.
Chiedo scusa per il termine improprio.
Anche col virgola mobile il comportamento è assolutamente 
deterministico. Solo che per ogni singolo elemento occorre una 
conversione umanamente non fattibile, e quindi tutto sembra 'non 
deterministico'.
Alberto
-- 
Noi ammazziamo solo per motivi buoni.
E quando sono buoni, sta a noi indicarlo.
[Guccini]

 report, ecc...
Allora, forse non è il caso, ma magari quel campo della griglia viene fuori
da un SQL del tipo
SELECT codarticol,qta,qta/pzXconfezione as colli
5/6= 0,8(3)
In questo caso ci sta che il DB ti dia un numero in virgola mobile (o
almeno penso), anche se basta castarlo al limite.
E' solo un esempio adattato che ho avuto da qualche parte.

Andrea [Work] ha usato la sua tastiera per scrivere :

Il risultato è in virgola mobile se almeno uno degli elementi coinvolti 
è in virgola mobile.
Quindi, può anche essere che ci sia in mezzo un virgola mobile, ma deve 
essere anche in questo caso una scelta voluta, se c'è finito per 
sbaglio è comunque un problema.
Io, quando utilizzo dei virgola mobile, faccio anche i Cast all'interno 
delle funzioni (ma anche al viceversa, cioè può accadere che un valore 
a virgola fissa io lo casti a virgola mobile dentro alla funzione per 
avere maggiore precisione, poi rimetto a virgola fissa il risultato).
L'importante è che queste cose siano gestite, non che 'accadano'.
Ciao
Alberto
-- 
Carlo Rubbia: Siamo su un treno che va a trecento chilometri all'ora, 
non sappiamo dove ci sta portando e, soprattutto, ci siamo accorti che 
non c'è il macchinista.

 essere 0.00000000001.
Ah, e come mai?
Confesso qua che non so cosa sia un numero in virgola mobile; ho sempre 
pensato che fosse un tipo di numero che serve per fare complicatissimi 
calcoli matematici, astronomici, eccc...
E comqune la dizione "virgola mobile" mi sembra una cosa strana. Semmai 
numero con virgola o senza virgola, ma perchè mobile? E mobile rispetto a 
cosa? A scuola ci avevano insegnato che la virgola va sempre dopo l'ultima 
unità. E se l'unità è zero dopo lo zero non importa, ma sempre li!
Mo vado a caccia con google, mi sa che stasera rivolvo il mistero della 
virgola :)
-- 
Greg 

 Ah, e come mai?
Perchè il mondo floating è un mondo a parte.
Se ti cerchi di inchiodare +10 in un virgola mobile, non è detto che il 
valore 10 (tondo tondo fino all'ultimo miliardesimo di miliardesimo) 
esista nel mondo floating. Allora viene scelto il valore virgola mobile 
più vicino. Che magari è mezzo miliardesimo maggiore di 10.
Poi devi usare -7. Magari non esiste -7 tondo tondo, e viene scelto il 
virgola mobile più vicino, che magari è mezzo miliardesimo minore. Fai 
la somma dei due virgola mobile scelti, e ti avanza un miliardesimo.
Se a questo punto fai Format$ di quel valore, e ti fermi a qualche 
posizione decimale, il miliardesimo viene mascherato.
Ma se fai "Where Totale=0", o "If Totale = 0 Then", il record non 
c'è...
Ciao
Alberto
-- 
Il tempo e la pazienza possono più della forza o della rabbia

 più vicino. Che magari è mezzo miliardesimo maggiore di 10.
Ma in VB6, sbaglio o questi problemi si hanno solo con i Double e non con i
Single?

Dopo dura riflessione, Andrea [Work] ha scritto :

Per quanto ne so io, con entrambi.
Alberto
-- 
Léo Campion: Il lavoro è l'occupazione di chi non ha nulla da fare.

 Alberto
Solo questi 2? E lato database (access) corrispondono a "precisione dingola" 
e precisione doppia"?
-- 
Greg 


wrote:

Ciao Alberto.
E allora che tipo di dato devo usare in Access per farmi visualizzare
esattamente quello che ho inserito?
Ho usato il Numerico - Precisione Singola perchè mi sembrava più
adatto.
I valori al massimo possono avere 2 cifre decimali.
Suggerimenti?
ciao sam--



La popolo con un recordset
set flex.datasource = rs
ciao sam--

una precisione decimale anzichè floating.
Allora mi dici per favore il tipo di dato che devo usare?
ciao e grazie
sam--



NO NO NO
In questo caso sono consapevole di quello che potrebbe venire fuori.
La query è "select campo1, campo2, campo3 from ...."
ciao sam--



FORSE CI SIAMO
Scrivo qui per tutti.
Mi sembra che il campo Numerico . Decimle sia la soluzione.
Lo accendiamo?
ciao sam-- 

 Per quanto ne so io, con entrambi.
E' solo che mettendo mano a codice scritto, casini di arrotondamenti li ho
trovati solo con i double e mai con i single, per questo avevo un dubbio.

Sam -- scriveva il 30/09/2008 :

Non hai detto, ed era ciò che ti chiedevo, cosa rappresenti con quel 
numero.
Se rappresenti un importo o una quantità simil-giacenza, qualunque tipo 
a virgola fissa va bene (la precisione dipenderà poi dalla tua logica 
applicativa).
Non ha comunque senso chiedere che tipo usare. Esistono tanti tipi, 
ognuno con le sue caratteristiche. Senza sapere di cosa si stia 
parlando, non ti si può dare alcun consiglio. Del resto, la 
tipizzazione è la prima cosa che si studia in informatica, ancora prima 
dei singoli linguaggi (che poi alla fine sono tutti validi, basta 
usarli bene).
Quindi, se sviluppi per professione e non per hobby, la differenza fra 
virgola fissa e virgola mobile la devi avere non chiara ma di più, 
quindi saprai cosa scegliere.
Ciao


Alberto
La tabella è una tabella dei cibi contenente le varie componenti del
cibo stesso, da usare pe le diete, per intenderci.
Quindi per ogni alimento, mostra ( riferito a 100 grammi), la quantità
di lipidi, di colesterolo, di proteine, ecc ecc.
Queste quantità sono espressi in grammi, es: 29,2 grammi di lipidi.
Al massimo posso avere due cifre decimali dopo la virgola.
Come ho scritto precedentemente, mi sembra di aver risolto con il tipo
di dato decimale.
L'unica cosa che mi piace poco è il valore 29,2 viene visualizzato
come 29,29 e il valore 0 come ,00
ciao e grazie
sam--

 come 29,29 e il valore 0 come ,00
Non è che 29,2 viene visualizzato come 29,29, è che è proprio 29,29.
Comunque prova ad usare i Currency per curiosità.



Ecco il riepilogo della prova
Campo di tipo decimale
Valore Inserito (in tabella direttamente): 29,2
Valore Visualizzato in Access: 29,2
Valore Visualizzato in MshFLexGrid: 29.20
Valore Inserito (in tabella direttamente): 0
Valore Visualizzato in Access: 0
Valore Visualizzato in MshFLexGrid: .00
Campo di tipo valuta
Valore Inserito (in tabella direttamente): 29,2
Valore Visualizzato in Access: simbolo dell'euro 29,20
Valore Visualizzato in MshFLexGrid: 29.2
Valore Inserito (in tabella direttamente): 0
Valore Visualizzato in Access: simbolo dell'euro 0,00
Valore Visualizzato in MshFLexGrid: 0
Il simbolo dell'euro lo posso levare nelle proprietà di visualizzione.
Il campo Valuta sembra andare bene.
Voi che ne dite?
ciao e grazie
sam--

 Il campo Valuta sembra andare bene.
Il tipo Valuta ï¿œ un comune tipo Decimale, ma 'preconfigurato' con un 
determinato numero di decimali e con l'opzione di visualizzare il 
simbolino della valuta a fianco, se il client gestisce questa opzione.
Per cui, se non devi memorizzare degli importi in valuta, tanto vale 
utilizzare direttamente il tipo Decimale impostando tu le posizioni 
decimali che ti interessano, anzichï¿œ usare il Valuta e poi togliere le 
sue caratteristiche peculiari.
Alberto
-- 
Konrad Adenauer: All'intelligenza Dio ha posto limiti, alla stupiditï¿œ 
no.

Alberto
Ciao Alberto, riguardo agli spippolamenti di access ci sono.
Quello che devo inserire sono dei valori dietetici come ho spiegato
nell'altro post.
Sono convinto che il tipo Valuta è un comune tipo Decimale,però quando
visulizzato i dati nella mshflexgrid vedo lo stesso valore
visualizzato in modo differente.
Il campo decimale sempre mi lascia le due( o quello che imposto) cifre
decimali
esempio lo 0 (zero) viene visualizzato in MshFLexGrid: .00
29,2 viene visualizzato in MshFLexGrid: 29,20
se metto il campo valuta in mshflexgrid visulizzo 0 e 29,2
C'è qualche opzione da modificare nel tipo decimale che mi potrebbe
portare al risultato voluto?
ciao e grazie
sam--