Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
Oerazioni Su Decimal
lunedì 17 novembre 2008 - 13.21
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
FedericoC
Profilo
| Junior Member
134
messaggi | Data Invio:
lun 17 nov 2008 - 13:21
Ciao,
devo effettuare delle operazioni su valori decimal, però vorrei considerare sempre e solo due cifre decimali..
Iniziamente facevo tutti i conti e dopo quando dvoevo stampare a video convertivo il decimale in una stringa salvando soltanto le due cifre con N2... però ho visto che con questi conti ho degli errori di +o- 1centesimo e purtroppo questo rappresenta un grave errore per me... Quindi dovrei considerare tutti i conti salvando soltanto le prime due cifre decime...
Qualcuno sa dirmi in che modo potrei farlo, oppure se c'è un meccanismo che mi potete consigliare per evitare questi errori di approssimazione?
Grazie
rossimarko
Profilo
| Guru
1.173
messaggi | Data Invio:
lun 17 nov 2008 - 14:26
Ciao,
per gli arrotondamenti puoi usare la funzione Math.Round:
http://msdn.microsoft.com/it-it/library/system.math.round.aspx
La logica invece dipende molto da quello che ti aspetti.. Se in tutti i passaggi vuoi usare le due cifre penso che dovrai usare la funzione tutte le volte che serve..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Teech
Profilo
| Expert
573
messaggi | Data Invio:
lun 17 nov 2008 - 14:30
Se ti riferisci al problema del calcolo del prezzo netto da inserire negli scontrini (
) per il quale calcolando gli sconti sulle righe ci sono questo genere di arrotondamenti puoi usare la funzione Math.Round , ma non credo risolva totalmente in problema. Se ti riferisci sempre agli scontrini posso dirti il problema è matematicamente insormontabile in alcuni casi (ho già avuto modo di scontrarmi con il problema e posso riproporti il ragionamento), se invece la problematica è diversa hai delle possibilità di soluzione proprio arrotondando gli operandi con la funzione Math.Round.
http://msdn.microsoft.com/it-it/library/zy06z30k.aspx
Ciao!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
FedericoC
Profilo
| Junior Member
134
messaggi | Data Invio:
lun 17 nov 2008 - 15:01
Il problema sta sulle fatture e relative prima nota...
Quando scorporo nella prima nota la fattura, con tutte le categorie merceologiche, alal fine il dare\avere non torna mai uguale perchè in alcune fatture ho delle differenze in centesimi...
Quindi sto facendo un paio di conti per vedere dove è che ho gli errori, perchè le fatture sono prese dai clacoli precedenti e salvati nel database, mentre la prima nota la calcola a run-time...
Teech
Profilo
| Expert
573
messaggi | Data Invio:
lun 17 nov 2008 - 15:20
Normalmente in questo passaggio si arrotonda sul valore di riga del documento di magazzino ((prezzo*quantità)-sconto) in quanto è il primo dato contabile che a livello legislativo deve essere considerato a 2 deciamali (in caso di valuta Euro) mentre il prezzo può avere anche più decimali (per pezzi di valore molto piccolo).
A questo punto ogni riga avrà una contropartita contabile e sommando per contropartite avrai sempre un valore a 2 decimali o comunque se devi calcolare ulteriormente sul dato aggregato (ad esempio uno sconto sul totale fattura) puoi utilizzare gli arrotondamenti in modo semplice ed immediato.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
FedericoC
Profilo
| Junior Member
134
messaggi | Data Invio:
lun 17 nov 2008 - 23:36
Dopo tante ore di controlli, forse ho trovato il problema:
Math.Round(System.Convert.ToDecimal(reader["quantita"]) * System.Convert.ToDecimal(reader["prezzo"]) * (1 - (System.Convert.ToDecimal(reader["sconto"])) / 100), 2) = 30,98
SUM( CAST( (
quantita * prezzo
) - ( quantita * prezzo ) * sconto / 100.00 AS decimal( 10, 2 ) ) ) AS imponibile = 30,99
l'operazione praticamente è 50*0,6197= 30,985 quindi dovrebbe approssimare a 30,99 come mysql fa correttamente...
Infatit se in c# tronco a 3, mi da 30,985....
EDIT:
Avessi letto con più attenzione il manuale non avrei postato questa ultima risposta
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !