2008-09-04 210 views
158

我正試圖確定最佳方式來截斷或刪除SQL中的額外小數位而不捨入四捨五入。例如:在SQL Server中截斷(不是舍入)小數位

declare @value decimal(18,2) 

set @value = 123.456 

這將自動輪@值爲123.46 ....在大多數情況下是好的。但是,對於這個項目我並不需要這個。有沒有簡單的方法來截斷我不需要的小數位?我知道我可以使用left()函數並將其轉換回小數點......使用其他方法?

回答

159
select round(123.456, 2, 1) 
-3
select convert(int,@value) 
+1

這不是OP想要的。他仍然需要小數位,但他想刪除它們(truncte)而不是四捨五入。 I.E. 123.456 - > 123.45不是123.456 - > 12.46而不是123.456 - > 123 – John 2012-06-28 14:57:36

4

你想十進制與否?

如果沒有,使用

select ceiling(@value),floor(@value) 

如果用0做它,然後做輪:

select round(@value,2) 
+1

對不起,如果我不清楚,我需要保留小數位,放棄那些我不想要的。例如,而不是我上面的示例中的123.456被轉換爲123.46 ...我想刪除第三個小數並將其設置爲123.45。 – 2008-09-04 15:55:58

209
ROUND (123.456 , 2 , 1) 

當第三個參數= 0它截斷,而不是發!

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

語法

ROUND(數值_表達式,長度[,函數])

參數

  • 數值_ 是對精確數值或近似數字數據 的表達類型的類別,除了位數據類型。

  • 長度 是要將numeric_expression四捨五入的精度。長度必須是tinyint,smallint或int類型的表達式。當長度爲正數時,numeric_expression將四捨五入爲長度指定的小數位數。當長度爲負數時,numeric_expression會在小數點左側進行四捨五入,如長度所指定。

  • 函數 是要執行的操作的類型。函數必須是tinyint,smallint或int。當省略函數或值爲0(默認值)時,numeric_expression將被舍入。如果指定的值不是0,則numeric_expression將被截斷。
+0

有人知道函數參數的值對應於tinyint,smallint和int嗎?微軟將這一部分從文檔中刪除,並且無法在任何地方找到答案。 https://msdn.microsoft.com/zh-cn/library/ms175003(SQL.90).aspx – Dave 2016-11-16 13:51:47

+0

MS SQL SERVER將數字與IQ進行有點不同的處理。 要修復使用round(x1,y2,z)函數round(val1/val2,4,1) – 2017-04-27 15:48:29

11

這裏是我能夠截斷而不是圓的方式:

select 100.0019-(100.0019%.001) 

收益100.0010

而且你的例子:

select 123.456-(123.456%.001) 

返回123。450

現在,如果你想擺脫結束零,只需將它轉換:

select cast((123.456-(123.456%.001)) as decimal (18,2)) 

收益123.45

5

沒有四捨五入的解決方案和示例另一個截斷。

Convert 71.950005666 to a single decimal place number (71.9) 
    1) 71.950005666 * 10.0 = 719.50005666 
    2) Floor(719.50005666) = 719.0 
    3) 719.0/10.0 = 71.9 

    select Floor(71.950005666 * 10.0)/10.0 
+2

+1(對於`Floor()`來說,這就是要捨去小數而不捨得捨去的方法。太糟糕Floor()沒有第二個參數來表示在哪個位置。但我認爲* 10)/ 10的確可以很好地解決這個問題。 – deroby 2011-12-15 11:30:48

26
SELECT Cast(Round(123.456,2,1) as decimal(18,2)) 
0

請嘗試使用此代碼後點轉換3個十進制值到小數點後2位:

declare @val decimal (8, 2) 
select @val = 123.456 
select @val = @val 

select @val 

輸出爲123.46

-3

Mod(x,1)是我最簡單的方法認爲。

+0

你爲什麼這麼想? – 2012-05-11 20:47:02

7

回合有一個可選的參數

Select round(123.456, 2, 1) will = 123.45 
Select round(123.456, 2, 0) will = 123.46 
+1

選擇一輪(123.456,2,1)will = 123.450 – Bikram 2018-01-29 22:47:35

+0

我不明白爲什麼這會得到提升。以上將分別給你123.450和123.460。 – 2018-02-28 07:12:03

0

我想你想只有在這種情況下,十進制值, 您可以使用以下方法:

declare @val decimal (8, 3) 
SET @val = 123.456 

SELECT @val - ROUND(@val,0,1) 
3

這將刪除的任何小數部分號碼

SELECT ROUND(@val,0,1) 
8

實際上無論第三個參數是0還是1或2,它不會影響你的價值。

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2)) 
0

另一種方式是ODBC TRUNCATE功能:

DECLARE @value DECIMAL(18,3) =123.456; 

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result 

LiveDemo

輸出:

╔═════════╦═════════╗ 
║ val ║ result ║ 
╠═════════╬═════════╣ 
║ 123,456 ║ 123,450 ║ 
╚═════════╩═════════╝ 

備註:

我建議使用內置有第三個參數設置ROUND功能1.

0

我知道這是相當晚了,但我不認爲這是一個答案,並一直在使用這一招的年份。

簡單地從您的值中減去.005並使用Round(@ num,2)。

你舉的例子:

declare @num decimal(9,5) = 123.456 

select round(@num-.005,2) 

收益123.45

它會自動調整四捨五入到你正在尋找正確的值。

順便說一句,你是從電影辦公空間重新創建節目嗎?