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

时间:2008-09-04 15:50:42

标签: sql sql-server tsql rounding

我正在尝试确定在SQL中截断或删除额外小数位的最佳方法,而不进行舍入。例如:

declare @value decimal(18,2)

set @value = 123.456

这会自动将@value舍入为123.46,这在大多数情况下都很好。但是,对于这个项目,我不需要那样做。是否有一种简单的方法来截断我不需要的小数?我知道我可以使用left()函数并转换回小数。还有其他方法吗?

19 个答案:

答案 0 :(得分:247)

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必须是tinyint,smallint或int类型的表达式。当length为正数时,numeric_expression将四舍五入为length指定的小数位数。当length为负数时,numeric_expression在小数点左侧舍入,由长度指定。

  • 功能 是要执行的操作类型。 function必须是tinyint,smallint或int。省略function或者值为0(默认值)时,numeric_expression将四舍五入。如果指定的值不是0,则会截断numeric_expression。

答案 1 :(得分:179)

select round(123.456, 2, 1)

答案 2 :(得分:31)

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

答案 3 :(得分:13)

这是我能够截断而不是舍入的方式:

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

答案 4 :(得分:9)

实际上无论第三个参数是0还是1或2,它都不会对你的值进行舍入。

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

答案 5 :(得分:8)

Round有一个可选参数

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

答案 6 :(得分:6)

另一个截断,没有舍入解决方案和示例。

    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

答案 7 :(得分:6)

你想要小数吗?

如果没有,请使用

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

如果你用0做,那么做一轮:

select round(@value,2)

答案 8 :(得分:4)

这将删除任何数字的小数部分

SELECT ROUND(@val,0,1)

答案 9 :(得分:1)

我知道这已经很晚了,但我不认为这是一个答案,而且多年来一直在使用这个技巧。

只需从您的值中减去.005并使用Round(@ num,2)。

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

它会自动将舍入调整为您正在寻找的正确值。

顺便问一下,您是否正在从电影Office Space重新创建该程序?

答案 10 :(得分:0)

请尝试使用此代码将点后的3个十进制值转换为2位小数:

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

select @val

输出为123.46

答案 11 :(得分:0)

我想你只想要十进制值, 在这种情况下,您可以使用以下内容:

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

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

答案 12 :(得分:0)

我知道这个问题真的很陈旧,但没有人使用子字符串进行舍入。这有利于舍入非常长的数字(SQL服务器中字符串的限制,通常为8000个字符):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

答案 13 :(得分:0)

我认为,使用Hackerrank中提供的更简单的示例解决方案,我们可以轻松得多:

  

问题陈述:查询北纬的最大价值   来自STATION的(LAT_N)小于137.2345。截断答案   到小数点后四位。

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

上面的解决方案使您知道如何简单地将值限制为4个小数点。如果要在小数点后降低或升高数字,只需将4更改为所需的数字即可。

答案 14 :(得分:0)

SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

将为您提供小数点后的2个值。 (MS SQL SERVER)

答案 15 :(得分:0)

尝试这样:

SELECT cast(round(123.456,2,1) as decimal(18,2)) 

答案 16 :(得分:0)

ROUND(number, decimals, operation)

number =>必需。四舍五入的数字
小数=>必需。将小数位数舍入为
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

答案 17 :(得分:-3)

Mod(x,1)是我认为最简单的方式。

答案 18 :(得分:-3)

select convert(int,@value)