ilmettiu (Ex-Member)
Pro
Messaggi: 88
Iscritto: 17/09/2009
|
Ok, mi arrendo... Perchè il tipo di dati Double mi da risultati sbagliati se i due numeri, per esempio in una sottrazione, hanno diverso numero di decimali? Non è che mi piaccia molto questa cosa...
//EDIT: Rettifico, anche con lo stesso numero di decimali, ma non ho ancora capito con quale logica. Per esempio, 22,22 - 22,24 risulta 9,99999999999979E-03. Non mi torna particolarmente.
Ultima modifica effettuata da ilmettiu il 08/10/2009 alle 18:28 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Sono errori caratteristici derivanti dalla rappresentazione binaria dei valori decimali.
Non derivano da questo o quel linguaggio, ma dal tipo di rappresentazione usata.
|
|
ilmettiu (Ex-Member)
Pro
Messaggi: 88
Iscritto: 17/09/2009
|
Che cu*o... In sostanza, il risultato è sbagliato o sono io che non lo so leggere?
EDIT: moderiamo le parole, cmq il risultato non è sbagliato xD
Ultima modifica effettuata da GrG il 08/10/2009 alle 20:25 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Ripeto ... e' un problema della rappresentazione, non un tuo errore o un tuo esclusivo problema.
Il risultato e' sbagliato ma deriva, appunto, dalla rappresentazione binaria con un numero di decimali limitato.
Per capirci, anche in decimale esistono problemi simili ... ad esempio
1 / 3 fa 0,33333
ma se fai 0,33333 x 3 non avrai 1 (e neanche se aggiungi altri decimali) ... allora, dimmi, e' il risultato giusto?
Puoi rimediare visualizzando il risultato tramite la Format che approssima in modo corretto aggirando il problema ...
P.S. L'esempio che hai fatto, forse, non e' quello corretto ...
|
|
ilmettiu (Ex-Member)
Pro
Messaggi: 88
Iscritto: 17/09/2009
|
Inizialmente ho rimediato con Round, ma qualche volta da risultati ancora più assurdi, e allora non c'è niente da fare -.-" Sto continuando il programma utilizzando Single, ma ovviamente non è la stessa cosa. Cosa intendi con l'ultima frase? I valori che ho preso non sono teorici: Sono quelli che ho provato al primo inserimento, e su cui di conseguenza mi sono impuntato E ho ricopiato pari pari il risultato. Faccio qualche altra prova e cerco di trarne una regola generale. Perchè magari sei riuscito a farmi capire in che cosa consiste il problema, ma la funzione Format non è una soluzione (come neanche Round o utilizzare il tipo Single): Sono tutti provvedimenti provvisori, perchè non danno la precisione che mi serve. Grazie per la delucidazione, se trovo una soluzione definitiva la posto qui
Ultima modifica effettuata da ilmettiu il 09/10/2009 alle 0:06 |
|
Alfonso (Ex-Member)
Guru
Messaggi: 688
Iscritto: 30/09/2009
|
Usa Currency
ci sono miglioramenti.
|
|
GrG (Member)
Guru^2
Messaggi: 3430
Iscritto: 21/08/2007
|
Postato originariamente da theprogrammer:
Il risultato e' sbagliato ma deriva, appunto, dalla rappresentazione binaria con un numero di decimali limitato.
|
lol non pensavo... |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Per rimediare, prova ad usare il tipo Variant sottotipo Decimal.
L'esempio che hai fatto era
22,22 - 22,24 = 9,99999999999979E-03
ma non mi pare sia giusto ...
|
|
ilmettiu (Ex-Member)
Pro
Messaggi: 88
Iscritto: 17/09/2009
|
Il risultato effettivamente è stato diviso per 2, mi scuso per la svista Comunque ho verificato che è proprio la sottrazione a dare problemi. E Currency, cosa sarebbe? Un tipo di dati? Comunque non son capace di usare Decimal, avevo già provato in un altro programma:
Qui http://msdn.microsoft.com/en-us/library/xtba3z33.aspx viene dichiato tranquillamente, ma a me dà "tipo definito dall'utente non definito".
Per il resto, applicando un po' meglio la funzione Round sono riuscito a correggere tutti gli errori. Il problema è che non sono sicuro al 100% di aver fixato i risultati anomali per ogni possibile valore di minuendo e sottraendo. Per ora non ho trovato valori che impallino tutto, ma non so come escludere che ce ne siano.
Ultima modifica effettuata da ilmettiu il 09/10/2009 alle 14:43 |
|