在SQL Server中截断(不是舍入)小数位数

我试图确定最好的方法来截断或删除额外的小数位,而不舍入四舍五入。 例如:

declare @value decimal(18,2) set @value = 123.456 

这将自动围绕@Value是123.46 ….在大多数情况下是好的。 但是,对于这个项目我不需要那个。 是否有一个简单的方法来截断我不需要的小数? 我知道我可以使用left()函数并将其转换回小数点…还有其他方法吗?

 select round(123.456, 2, 1) 
 ROUND ( 123.456 , 2 , 1 ) 

当第三个参数!= 0时,它截断而不是舍入

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

句法

ROUND(数字expression式,长度[,函数])

参数

  • 数字expression式除了位数据types以外,是精确的数字或​​近似数字数据types类别的expression式。

  • length是numeric_expression要被舍入的精度。 长度必须是tinyint,smallint或inttypes的expression式。 当长度为正数时,numeric_expression将四舍五入为长度指定的小数位数。 当长度为负数时,numeric_expression在小数点的左侧进行四舍五入,如长度所指定。

  • 函数是要执行的操作的types。 函数必须是tinyint,smallint或int。 当省略函数或值为0(默认值)时,numeric_expression将被舍入。 如果指定的值不是0,则numeric_expression将被截断。
 SELECT Cast(Round(123.456,2,1) as decimal(18,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

Round有一个可选参数

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

实际上,无论第三个参数是0还是1或2,都不会影响您的价值。

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

另一个截断没有舍入解决scheme和示例。

  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 ceiling(@value),floor(@value) 

如果你用0来做,那就做一轮:

 select round(@value,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) 

另一种方法是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 ║ ╚═════════╩═════════╝ 

备注:

我build议使用第三个参数设置为1的内置ROUND函数。

我知道这是相当晚,但我不认为这是一个答案,多年来一直使用这个技巧。

简单地从你的值中减去.005,并使用Round(@ num,2)。

你的例子:

 declare @num decimal(9,5) = 123.456 select round(@num-.005,2) 

返回123.45

它会自动调整舍入到你正在寻找的正确值。

顺便说一句,你是从电影“办公空间”重现这个节目吗?

 select convert(int,@value) 

Mod(x,1)是我想的最简单的方法。