Oerazioni Su Decimal

lunedì 17 novembre 2008 - 13.21

FedericoC Profilo | Junior Member

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

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

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

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

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

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
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 !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5