Double o decimal?

sabato 29 marzo 2008 - 23.48

FedericoC Profilo | Junior Member

Ciao,

devo memorizzare e gestire dati monetari, come ad esempio importi di fatture considerando fino a 4 numeri dopo la virgola...

Sia nel database (MySQL) che nel programma posso utilizzare i dati double oppure devo utilizzare i decimal?

Con i decilmal ho dei problemi a moltiplicare con le quantità (double), quindi mi chiedevo se non conviene utilizzare decimal o double?


grazie

rossimarko Profilo | Guru

Ciao,

dal punto di vista del framework i double sono numeri in virgola mobile, quindi sono soggetti ad arrotondamenti. Io di solito utilizzo sempre i decimal quando ho a che fare con importi o quantità, perchè mi garantiscono la precisione del dato contenuto. Questo sia per quanto riguarda il framework sia per quanto riguarda Sql Server. Su my sql penso che la differenza sia analoga, però dovresti verificare.
I tipi double li uso per i calcoli aritmetici.

Ti riporto un esempio curioso che mi è capitato una volta: avevo il totale di un ordine (calcolato e salvato in una variabile double) che risultava di 100,00000000000000001€ invece che 100 €.
Avendo io una funzione che verificava che il totale fosse <= 100€ mi veniva segnalato un errore anche se l'importo era corretto. Ovviamente modificando i tipi di dato e mettendoli decimal questo errore non si verificava più. Avrei potuto cercamente mettere un arrotondamento nella funzione, ma ho preferito cambiare il tipo per essere più tranquillo.

alx_81 Profilo | Guru

>Su my sql penso che la differenza sia analoga, però dovresti verificare.
corretto è analoga. Decimal garantisce la precisione, FLOAT, REAL e DOUBLE (da evitare se non vuoi avere problemi di arrotondamento come dice rossimarko) sono a virgola mobile. SQL Server ha in più i tipi di dato per le valute (come money e smallmoney).

Eccoti la reference di MYSQL:
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

Ciao!
Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

FedericoC Profilo | Junior Member

quindi mi conviene passare anche le quantità, attualmente in double in decimal?

Perchè .net non mi permette di moltiplicare Double * Decimal come se niente fosse...

alx_81 Profilo | Guru

>quindi mi conviene passare anche le quantità, attualmente in
>double in decimal?
ma le quantità che unità di misura devono esprimere?
si tratta di "10 scatole"? o di "10.54Kg di scatole"?
Perchè se sai che il campo sarà intero, non usare nè l'uno nè l'altro..
Viceversa credo che i decimal siano quello che ti serve.
Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

FedericoC Profilo | Junior Member

numeri con virgola 1,232 eccc...

Quindi a questo punto uso i decimal per tutto...

Anonimo Profilo | Senior Member

Se la memoria e la velocità di calcolo non sono un problema meglio i decimal sempre e comunque perchè portano con se un'enorme precisione utile nelle divisioni e nelle sottrazioni vicine allo zero come risultato. Ma se tu usi solo 4 decimali allora i double vanno più che bene e ti avanzano pure, in quanto portano con se più di 20 decimali e sono gestiti direttamente dal sistema e non hanno bisogno di trattamenti speciali, perciò per una migliore prestazione sicuramente i double sono ottimi e ne hai d'avanzo.

Nel tuo caso direi double per una migliore stabilità del sistema per non essere troppo sovradimensionato.

Team Icon - Software Engineering
------------------------------
Unicredit Global Information Services Spa
Senior Developer

rossimarko Profilo | Guru

>Se la memoria e la velocità di calcolo non sono un problema meglio
>i decimal sempre e comunque perchè portano con se un'enorme precisione
>utile nelle divisioni e nelle sottrazioni vicine allo zero come
>risultato. Ma se tu usi solo 4 decimali allora i double vanno
>più che bene e ti avanzano pure, in quanto portano con se più
>di 20 decimali e sono gestiti direttamente dal sistema e non
>hanno bisogno di trattamenti speciali, perciò per una migliore
>prestazione sicuramente i double sono ottimi e ne hai d'avanzo.
>
>Nel tuo caso direi double per una migliore stabilità del sistema
>per non essere troppo sovradimensionato.

Occhio che quando si devono memorizzare degli importi il campo double può portare a degli errori non trascurabili.

Se guardiamo la documentazione possiamo vedere che anche la microsoft consiglia di usare i decimal verso sql server per i tipi di dato Money o SmallMoney, quindi dove vengono memorizzati degli importi: http://msdn2.microsoft.com/en-us/library/ms131092.aspx

A scopo di esempio vi riporto due cicli, apparentemente identici, ma che hanno un risultato ben diverso l'uno dall'altro, e l'unica differenza è il tipo di dato utilizzato:


Dim dDoubleTotal As Double = 0 For i As Double = 0 To 1 Step 0.01 dDoubleTotal += 1 Next

Dim dDecTotal As Decimal = 0 For i As Decimal = 0 To 1 Step 0.01D dDecTotal += 1 Next

Se provate ad eseguire i due frammenti di codice vedrete che ottenete due risultati diversi:
- dDoubleTotal = 100
- dDecTotal = 101

ovviamente il risultato corretto è quello con il decimal, perchè i cicli da fare sono 101
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