2012-04-22 17 views

回答

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

如果你想有一個特定的精密天平,則這樣說:

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

1爲第一部分,但要注意,第二實施例的。這個'CONVERT'是在分裂之後應用的,並且不能給你多於已有的6位小數位數。 – 2012-12-17 12:30:13

+0

完美解決方案!我想第一個表現更好!不是嗎? – Diablo 2016-05-09 08:40:42

+0

@Diablo那麼,你可以測試它,但我懷疑你會發現任何區別。無論如何,如果您需要特定的精度/比例,請在您的應用程序層中進行格式化。 – 2016-05-09 14:33:16

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

編輯:這是如何工作的引擎蓋下?

結果類型與兩個參數的類型相同,或者如果它們不同,則由data type precedence table確定。因此,您可以將任何參數轉換爲非整數的參數。

現在DECIMAL(18,0),或者你能等效寫只是DECIMAL,仍然是一種整數類型的,因爲這0默認的比例意味着「沒有數字的小數點右邊」。因此,在不同的情況下,對四捨五入到整數的工作可能很好 - 這與我們正在努力完成的事情相反。

但是,DECIMALs對於一切都有自己的規則。他們通常是非整數,但總是精確的數字。在我們的例子中,我們強制出現的DECIMAL分區的結果類型是DECIMAL(29,11)。因此,除法結果將被舍入到11個不考慮除數爲10的位置,但除以3時舍入變爲可觀察的。您可以通過操縱左側操作數的比例來控制舍入的數量。通過在整個表達式中放置另一個ROUND或CAST操作,您也可以舍入更多,但不會更少。

相同力學支配在接受的答案的更簡單和更好的解決方案:

SELECT height/10.0 

在這種情況下,該除數的類型是DECIMAL(3,1)和結果的類型是DECIMAL(17,6)。嘗試除以3,觀察舍入的差異。

如果你只是討厭精度和規模的所有這些討論,只想SQL服務器執行好老雙精度浮點算術從某一點上所有的計算,你可以強制,太:

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

或等價只是

SELECT height/CAST (10 AS FLOAT) 
5

您可以施放高度爲十進制:

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

或者你把你的價值小數點你被劃分:

declare @height int 
set @height = 1023 

select @height/10.0 as heightdecimal 

看到sqlfiddle用一個例子

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

'十進制(任何東西)'?爲什麼不指定? – 2012-04-22 20:10:13

+0

你對分裂是正確的,但可能產生溢出問題,例如乘法。 '十進制(H)* 10'一般可能不等於'十進制(G * 10)',以爲我已經長大習慣投下第一操作 – Dewfy 2012-04-22 20:25:49

+3

之前我同意有明確的轉換前的操作是更好的這樣的方式。但我的觀點是,如果你要說'小數',你應該說'小數(精度,比例)'。 – 2012-04-22 20:58:20

相關問題