Troncamento decimal

lunedì 29 settembre 2008 - 10.56

stepic77 Profilo | Newbie

Ciao ragazzi, perchè eseguendo queste 2 operazioni con SQL 2005 ottengo 2 risultati diversi?
Ci sono delle impostazioni di default che troncano i decimali?

declare @valore1 decimal(29,13) declare @valore2 decimal(29,13) DECLARE @RAPPORTO_B decimal(29,13) SET @valore1 = 0.1234567896233 SET @valore2 = 1.0000000000000 SET @RAPPORTO_B = @valore1/@valore2 print(@RAPPORTO_B) -- 0.1234567890000 SET @RAPPORTO_B = 0.1234567896233/1.0000000000000 print(@RAPPORTO_B) -- 0.1234567896233


Ho visto che il @@MAX_PRECISION è 38 ma a me servono 42...

lbenaglia Profilo | Guru

>Ciao ragazzi, perchè eseguendo queste 2 operazioni con SQL 2005
>ottengo 2 risultati diversi?

Leggi questo paragrafo dei Books Online:
http://msdn.microsoft.com/en-us/library/ms190476.aspx

Nel tuo caso come precision avrai:
29 - 13 + 13 + max(6, 13 + 29 + 1) = 72 che supera il numero massimo di 38, pertanto SQL Server sacrificherà lo scale per mantenere il numero massimo di cifre intere.

declare @valore1 decimal(29,13) declare @valore2 decimal(29,13) DECLARE @RAPPORTO_B decimal(29,13) SET @valore1 = 0.1234567896233 SET @valore2 = 1.0000000000000 SELECT @valore1/@valore2 AS Output; /* Output: Output --------------------------------------- 0.123456789 (1 row(s) affected) */

Se diminuisci la precision otterrai il medesimo risultato:

declare @valore1 decimal(14,13) declare @valore2 decimal(14,13) DECLARE @RAPPORTO_B decimal(14,13) SET @valore1 = 0.1234567896233 SET @valore2 = 1.0000000000000 SELECT @valore1/@valore2 AS Output; /* Output: Output --------------------------------------- 0.123456789623300000000000 (1 row(s) affected) */

>Ho visto che il @@MAX_PRECISION è 38 ma a me servono 42...
Eh, non puoi.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stepic77 Profilo | Newbie

Dopo uno studio approfondito ed un consiglio di un mio amico, ho verificato che posso abbassare la soglia di precisione a (24,12), risolvendo il problema


declare @valore1 decimal(24,12) declare @valore2 decimal(24,12) DECLARE @RAPPORTO_B decimal(24,12) SET @valore1 = 121212121212.123456789623 SET @valore2 = 1.000000000000 SET @RAPPORTO_B = @valore1/@valore2 print(@RAPPORTO_B) SET @RAPPORTO_B = 121212121212.1234567896233/1.000000000000 print(@RAPPORTO_B) SET @RAPPORTO_B = @valore1*@valore2 print(@RAPPORTO_B) SET @RAPPORTO_B = 121212121212.1234567896233*1.000000000000 print(@RAPPORTO_B)
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