簡體   English   中英

在 SQL Server 中截斷(非舍入)小數位

[英]Truncate (not round) decimal places in SQL Server

我正在嘗試確定在不舍入的情況下截斷或刪除 SQL 中額外小數位的最佳方法。 例如:

declare @value decimal(18,2)

set @value = 123.456

這會自動輪@value123.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

LiveDemo

輸出:

╔═════════╦═════════╗
║   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)正在做什么:

截圖來自 https://www.w3schools.com/sql/sql_datatypes.asp

所以,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM