2014-01-12 81 views
8

我讀取T-SQL的所有舍入函數,如Round,FloorCeil,但它們都沒有爲我正確舍入十進制數。舍入SQL Server 2008中的十進制數

我有2個問題:

  1. 如何捨去小數(3.69 ==>3.5)?
  2. 如何取整數的最後3位數(例如142600 ==>143000)?
+0

你應該寫udf。 –

回答

6

1)select CAST(FLOOR(2 * 3.69)/2 AS decimal(2, 1))處理第一種情況下 - 的answer to a similar question on SQL Server Forums,我適於並迅速檢查的禮貌。

請注意,如果你是四捨五入到最接近0.5的數字可能會更大(如333.69 =>333.5),可以肯定,當你施放指定更多decimal精度(例如select CAST(FLOOR(2 * 3.69)/2 AS decimal(10, 1))),或者你可以得到一個溢出錯誤:

Msg 8115, Level 16, State 8, Line 1 
Arithmetic overflow error converting numeric to data type numeric. 

額外的精度不會影響底線結果(即select CAST(FLOOR(2 * 3.69)/2 AS decimal(10, 1))select CAST(FLOOR(2 * 3.69)/2 AS decimal(2, 1))都得到3.5);但是如果您舍入的數字總是較小,那就很浪費。

有關示例的在線參考可用於T-SQL FLOOR,CASTdecimal以提供幫助。

2)select ROUND(142600, -3)處理第二種情況。

一個類似的在線參考可用於T-SQL ROUND

+1

謝謝J0e3gan.It正常工作! –

1

作爲每@ J0e3gan的anwser,Sql Server's Round使用length參數,其中長度是10^(-length)允許四捨五入至10最近的權力,例如

length = 0 : 10^0 = nearest 1 
length = 3 : 10^-3 = nearest .001 
length = -3 : 10^3 = nearest 1000 

然而,在一般情況下,用一個簡單的基於1的舍入函數 - 例如(長度= 0的圓形)以四捨五入爲「最接近的N」的任意值 - 具有以下公式:

round(X/N) * N 

例如,最近的100

select round(12345/100.0, 0) * 100.0 -- 12300 
select round(-9876/100.0, 0) * 100.0 -- -9900 
select round(-9849/100.0, 0) * 100.0 -- -9800 

...最近的0.5

select round(5.123/0.5, 0) * 0.5 -- 5.000 
select round(6.499/0.5, 0) * 0.5 -- 6.500 
select round(-4.499/0.5, 0) * 0.5 -- -4.50 

...最近的0.02

select round(5.123/.02, 0) * .02 -- 5.12 
select round(-9.871/.02, 0) * .02 -- -9.88 

記住的是,用於約數的類型必須是數字/十進制或浮點數。

+0

謝謝你的回覆。所有的代碼都是真實的 –

0

Oracle/PLSQL FLOOR函數返回等於或小於數字的最大整數值。 例如:

FLOOR(7.9) 
Result: 7 

FLOOR(30.29) 
Result: 30 

FLOOR(-7.9) 
Result: -8