2011-05-25 24 views
3

有什麼辦法將一個數字轉換成小數點後指定的小數位數?我試過了:用指定的小數位數鑄成​​一個小數

SELECT ... 
     CAST(NumericField AS NUMERIC(15, @DecimalPlaces) AS NumericField, 
     ... 

但它沒有奏效。


編輯:我犯了一個錯誤,並寫了NUMBER而不是NUMERIC。但問題仍然存在:我如何使用指定的小數位數投射到NUMERIC

+0

是不是應該爲DECIMAL而不是NUMBER – 2011-05-25 00:33:58

+1

@Conrad Frix:在SQL Server中,'NUMBER'和「DECIMAL」是同義詞,AFAIK。無論如何,我正在使用的數據庫的所有定點小數字段都指定爲「NUMBER」。 – pyon 2011-05-25 00:37:37

+1

@eduardo我知道[數字](http://msdn.microsoft.com/en-us/library/ms187746(v = sql.90).aspx)(雖然我從來沒有使用它)你確定NUMBER – 2011-05-25 00:44:31

回答

2
declare @decimal int=5 
declare @decimalNum float =8931.0380106023125083 

select ROUND(@decimalNum, @decimal,1) 

對於尾隨零使用:

declare @decimal int=5 
declare @decimalNum float =8931.12 

select STR(@decimalNum, 25, @decimal) 

請注意,上面的選擇將返回VARCHAR類型,不是小數,數字,浮動或任何其他類型。

+0

這不會保留尾隨零。如果你嘗試'聲明@decimalNum float = 8931'和5'dp',它會顯示'8931'而不是'8931.00000' – 2011-05-25 00:56:59

+0

哦,我明白你想要做什麼。你需要格式化的字符串表示,而不是小數,因爲8931.00000不是小數,它是整數。 – Dimitri 2011-05-25 01:00:08

+0

嘗試第二個查詢 – Dimitri 2011-05-25 01:09:29

1

要投射爲十進制而不是數字..

鑄造(值爲十進制(10,2))圖10是總數包括小數和2小數位數

+0

(順便說一下,它實際上是Domínguez?)我希望能夠指定小數位數作爲參數。 – pyon 2011-05-25 00:42:29

1

的一種方式......

WITH T(NumericField, DecimalPlaces) AS 
(
SELECT 1.234,10 UNION ALL 
SELECT 1.234,3 
) 
SELECT CASE DecimalPlaces 
     WHEN 15 THEN CAST(NumericField AS NUMERIC(30, 15)) 
     WHEN 14 THEN CAST(NumericField AS NUMERIC(30, 14)) 
     WHEN 13 THEN CAST(NumericField AS NUMERIC(30, 13)) 
     WHEN 12 THEN CAST(NumericField AS NUMERIC(30, 12)) 
     WHEN 11 THEN CAST(NumericField AS NUMERIC(30, 11)) 
     WHEN 10 THEN CAST(NumericField AS NUMERIC(30, 10)) 
     WHEN 09 THEN CAST(NumericField AS NUMERIC(30, 9)) 
     WHEN 08 THEN CAST(NumericField AS NUMERIC(30, 8)) 
     WHEN 07 THEN CAST(NumericField AS NUMERIC(30, 7)) 
     WHEN 06 THEN CAST(NumericField AS NUMERIC(30, 6)) 
     WHEN 05 THEN CAST(NumericField AS NUMERIC(30, 5)) 
     WHEN 04 THEN CAST(NumericField AS NUMERIC(30, 4)) 
     WHEN 03 THEN CAST(NumericField AS NUMERIC(30, 3)) 
     WHEN 02 THEN CAST(NumericField AS NUMERIC(30, 2)) 
     WHEN 01 THEN CAST(NumericField AS NUMERIC(30, 1)) 
     WHEN 00 THEN CAST(NumericField AS NUMERIC(30, 0)) 
     ELSE CAST(NULL AS SQL_VARIANT) 
     END 
FROM T  
2

declare @Value float = 123.4567, @RoundTo int = 2 
 
select round(@Value * power(10, @RoundTo), 0)/power(10, @RoundTo)

+1

這正是我認爲最優雅的解決方案,並且需要位於頂部(當前的最佳答案是字符串,而不是數字,這是麻煩的處方) – Digs 2015-10-27 00:12:13

1

也許你可以試試這個: DECLARE @quantityPrecision INT = 5; 集@quantityPrecision = yourvalue 更新TABLEA 設定數量= ROUND(數量,@ quantityPrecision) 其中XXX