2012-04-22 36 views

risposta

53
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever; 

Se si desidera una scala specifica di precisione, ditelo:

SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal 
    FROM dbo.whatever; 
+5

+1 per la prima parte, ma attenzione al secondo esempio. Questo 'CONVERT' è applicato post-divide e non può darti più di 6 cifre decimali che hai già. –

+0

soluzione perfetta !! Immagino che prima si esibisca meglio! non è vero? – Diablo

+0

@Diablo Bene, potresti testarlo, ma dubito che noterai qualche differenza. Ad ogni modo, se hai bisogno di precisione/scala specifiche, esegui questa formattazione nel tuo livello applicazione. –

17
SELECT CAST(height AS DECIMAL(18,0))/10 

Edit: Come funziona sotto il cofano?

Il tipo di risultato è uguale al tipo di entrambi gli argomenti oppure, se sono diversi, è determinato dallo data type precedence table. È quindi possibile trasmettere entrambi gli argomenti a qualcosa di non integrale.

Ora DECIMAL(18,0), o si potrebbe equivalentemente scrivere solo DECIMAL, è ancora una sorta di tipo intero, perché quella scala di default di 0 significa "nessun cifre a destra del punto decimale". Quindi, un cast ad esso potrebbe, in circostanze diverse, funzionare bene per arrotondare a interi: l'opposto di ciò che stiamo cercando di realizzare.

Tuttavia, DECIMAL ha le proprie regole per tutto. Sono generalmente non interi, ma sempre numeri esatti. Il tipo di risultato della divisione DECIMAL che abbiamo forzato a verificarsi è is determined specially, nel nostro caso, DECIMAL (29,11). Il risultato della divisione sarà quindi arrotondato a 11 posizioni che non interessano la divisione di 10, ma l'arrotondamento diventa osservabile dividendo per 3. È possibile controllare la quantità di arrotondamento manipolando la scala dell'operando di sinistra. Puoi anche arrotondare di più, ma non di meno, posizionando un'altra operazione ROUND o CAST intorno all'intera espressione.

meccanica identici governa la soluzione più semplice e più piacevole la risposta accettata:

SELECT height/10.0 

In questo caso, il tipo di divisore è DECIMAL(3,1) e il tipo del risultato è DECIMAL(17,6). Prova a dividere per 3 e osserva la differenza nell'arrotondamento.

Se basta odio tutto questo parlare di precisioni e scale, e vogliono solo SQL server per eseguire tutti i calcoli in buon vecchio doppia precisione floating aritmetica in virgola da un certo punto in poi, è possibile forzare anche questo:

SELECT height/CAST(10 AS FLOAT(53)) 

o equivalentemente semplicemente

SELECT height/CAST (10 AS FLOAT) 
5

o si può lanciare Altezza come decimali:

select cast(@height as decimal(10, 5))/10 as heightdecimal 

o si inserisce un punto decimale nel valore che si sta dividendo per:

declare @height int 
set @height = 1023 

select @height/10.0 as heightdecimal 

vedono sqlfiddle con un esempio

2
select cast (height as decimal)/10 as HeightDecimal 
+0

'decimale (niente, niente)'? Perché non specificare? –

+0

Hai ragione riguardo alla divisione, ma puoi produrre un problema di overflow, ad esempio per la moltiplicazione. 'decimal (h) * 10' in generale potrebbe non essere uguale a' decimal (g * 10) ', pensando in questo modo ho preso l'abitudine di lanciare prima dell'operazione – Dewfy

+3

Concordo un cast esplicito prima che le operazioni siano migliori. Ma il mio punto era che se hai intenzione di dire "decimale" dovresti dire "decimale (precisione, scala)". –

Problemi correlati