Problema arrotondamenti

lunedì 02 maggio 2016 - 17.11

memmo77 Profilo | Expert

In una select effettuo un'operazione di divisione e successiva moltiplicazione per 100. Il risultato che dovrei ottenere è il seguente:

print (0.141000000000 / 401968.611000000000) * 100 = 0.0000350773657796877080

Invece ottengo, per quante conversioni tenti di fare:


756x394 85Kb


Cosa potrei fare per ottenere un buon arrotondamento con decimal(24,12)?
Grazie

ysdemarc Profilo | Expert

in tutte le divisione che riporti [1] / [2]

prova a scrive CAST([1] AS DECIMAL(24,12)) /CAST([2] AS DECIMAL(24,12))

ysdemarc Profilo | Expert

in tutte le divisione che riporti [1] / [2]

prova a scrive CAST([1] AS DECIMAL(24,12)) /CAST([2] AS DECIMAL(24,12))

memmo77 Profilo | Expert

Già provato, finchè faccio la divisione [1]/[2] (anche con cast), funziona correttamente.
L'arrotondamento avviene col moltiplicarli * pvt.FATTORE (anche se castato, che in questo caso vale 100).
Il risultato che ne esce è sempre 0.000035 perdendosi tutti gli altri decimali. Al massimo, se aggiungo anche il cast finale di tutto il conteggio, ottengo:
0.000035000000
Ma non i "veri" decimali

Grazie mille

ysdemarc Profilo | Expert

non la vedo proprio così la tua istruzione, un cast globale non è come un cast a singolo campo.

se scrivi così:

(CAST([1] AS DECIMAL(24,12)) /CAST([2] AS DECIMAL(24,12))) / CAST(pvt.Fattore AS DECIMAL(24,12))


cosa succede?

memmo77 Profilo | Expert

Niente da fare, ottengo sempre: 0.000035

Una prova davvero strana che ho provato a fare è quella di convertire il fattore:

CAST([1] AS DECIMAL(24,12)) / CAST([2] AS DECIMAL(24,12)) * cast(pvt.FATTORE as tinyint)

In sostanza se lo converto tinyint il calcolo viene 0.0000350774
Il problema è che tinyint non posso utilizzarlo perchè a volte, questo fattore è 1000 e la conversione, ovviamente, va in errore.
In pratica è il fattore (che è un int), che da questo problema facendo si che si perdano i decimali.

Grazie ancora per lo scambio di idee.
Ciao

ysdemarc Profilo | Expert

molto strano, anche perchè tinynt sarebbe in parole povere un int più piccolo...

prova a questo punto un cast decimal (8,4) oppure money vedi cosa succede

memmo77 Profilo | Expert

Allora, direi che quasi ci siamo, con:

([1] / [2]) * cast(pvt.FATTORE as decimal(8,4))

ottengo 0.000035077

Se lo riducessi a ([1] / [2]) * cast(pvt.FATTORE as decimal(4,1))

otterrei 0.0000350774

Però il mio fattore arriva da un int (che mi dicono dovrebbe essere massimo 1000), però, fidarsi è bene .... quindi, credo che il compromesso 8,4 vada bene.


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