![](/img/trans.png)
[英]Truncate the result to to two decimal places and round them up to the next whole percent in SQL Server
[英]Truncate (not round) decimal places in SQL Server
我正在嘗試確定在不舍入的情況下截斷或刪除 SQL 中額外小數位的最佳方法。 例如:
declare @value decimal(18,2)
set @value = 123.456
這會自動輪@value
是123.46
,這是在大多數情況下,良好的。 但是,對於這個項目,我不需要那個。 有沒有一種簡單的方法來截斷我不需要的小數? 我知道我可以使用left()
函數並轉換回十進制。 還有其他方法嗎?
ROUND ( 123.456 , 2 , 1 )
當第三個參數!= 0它截斷而不是舍入
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
句法
ROUND ( numeric_expression , length [ ,function ] )
參數
numeric_expression
是精確數字或近似數字數據類型類別的表達式,位數據類型除外。
length
是 numeric_expression 要四舍五入的精度。 length 必須是 tinyint、smallint 或 int 類型的表達式。 當 length 為正數時,numeric_expression 將四舍五入為 length 指定的小數位數。 當長度為負數時,numeric_expression 在小數點左側四舍五入,如長度所指定。
function
是要執行的操作類型。 函數必須是 tinyint、smallint 或 int。 當函數被省略或值為 0(默認)時,numeric_expression 被四舍五入。 指定 0 以外的值時,numeric_expression 將被截斷。select round(123.456, 2, 1)
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
實際上,無論第三個參數是 0 或 1 還是 2,它都不會舍入您的值。
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
這是我能夠截斷而不是圓的方式:
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
你要小數還是不要?
如果沒有,請使用
select ceiling(@value),floor(@value)
如果你用 0 來做,那么做一個回合:
select round(@value,2)
Round 有一個可選參數
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
另一個沒有舍入解決方案和示例的截斷。
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
這將刪除任何數字的小數部分
SELECT ROUND(@val,0,1)
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;
會在小數點后給你 2 個值。 (MS SQL 服務器)
另一種方法是ODBC TRUNCATE
函數:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
輸出:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
備注:
我建議使用內置的ROUND
函數,並將第三個參數設置為 1。
我知道這已經很晚了,但我不認為這是一個答案,並且多年來一直在使用這個技巧。
只需從您的值中減去 .005 並使用 Round(@num,2)。
你的例子:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
返回 123.45
它會自動將舍入調整為您正在尋找的正確值。
順便問一下,您是從電影《辦公空間》中重新創建程序嗎?
像這樣嘗試:
SELECT cast(round(123.456,2,1) as decimal(18,2))
請嘗試使用此代碼將點后的 3 個十進制值轉換為 2 個小數位:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
輸出為 123.46
我認為您只需要十進制值,在這種情況下,您可以使用以下內容:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
我知道這個問題真的很老,但沒有人使用子字符串來舍入。 這是能夠舍入非常長的數字的優勢(SQL Server 中的字符串限制,通常為 8000 個字符):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
我認為我們可以通過在 Hackerrank 中找到的更簡單的示例解決方案變得更容易:
問題陳述:從STATION查詢北緯(LAT_N)小於137.2345的最大值。 將您的答案截斷至小數點后 4 位。
SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;
上面的解決方案讓您了解如何簡單地將值限制為 4 個小數點。 如果您想降低或提高小數點后的數字,只需將 4 更改為您想要的任何值。
ROUND(number, decimals, operation)
數字 => 必需。 要四舍五入的數字
小數 => 必需。 將數字四舍五入到的小數位數
操作 => 可選。 如果為 0,則將結果四舍五入到小數位數。 如果其他值不是 0,則將結果截斷為小數位數。 默認值為 0
SELECT ROUND(235.415, 2, 1)
會給你235.410
SELECT ROUND(235.415, 0, 1)
會給你235.000
但是現在修剪0
你可以使用cast
SELECT CAST(ROUND(235.415, 0, 1) AS INT)
會給你235
如果你89.0904987
一些像89.0904987
這樣的89.09
簡單地省略89.09
不需要的小數位把它變成89.09
,只需使用以下內容:
select cast(yourColumnName as decimal(18,2))
以下屏幕截圖來自W3Schools SQL 數據類型部分,它描述了decimal(18,2)
正在做什么:
所以,
select cast(89.0904987 as decimal(18,2))
給你: 89.09
Mod(x,1)
是我認為最簡單的方法。
select convert(int,@value)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.