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


194

我试图确定截断或删除SQL中多余的小数位而不舍入的最佳方法。例如:

declare @value decimal(18,2)

set @value = 123.456

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

Answers:


188
select round(123.456, 2, 1)

27
答案应该说明该函数的参数是什么
Tyler

9
SQL ROUND(数字,小数,运算):运算->如果为0,则将结果舍入为小数位数。如果另一个值不为0,则将结果截断为小数位数。默认值为0
Midhun Darvin

您是救生员,我只能显示最后两位数字“ 1.9991666”,但是无论我使用什么,它总是四舍五入,因此我可以实现以下目的-选择FORMAT(round(1.9991666) ,2,1),'N2')AS'Rate',谢谢队友
蜘蛛

269
ROUND ( 123.456 , 2 , 1 )

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

http://msdn.microsoft.com/zh-CN/library/ms175003(SQL.90).aspx

句法

ROUND ( numeric_expression , length [ ,function ] )

争论

  • numeric_expression 是精确数字或近似数字数据类型类别的表达式,位数据类型除外。

  • length 将numeric_expression舍入的精度。length必须是tinyint,smallint或int类型的表达式。当length为正数时,numeric_expression将舍入为length指定的小数位数。当length为负数时,numeric_expression在小数点的左侧舍入,如length所指定。

  • function 是要执行的操作的类型。函数必须是tinyint,smallint或int。如果省略函数或值为0(默认值),则将数字表达式四舍五入。当指定非0的值时,numeric_expression被截断。

有人知道函数参数的值对应于tinyint,smallint和int吗?Microsoft将其遗漏在文档中,无法在任何地方找到答案。msdn.microsoft.com/zh-cn/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER对数字的舍入与IQ略有不同。要解决此问题,可使用类似于round(val1 / val2,4,1)的round(x,y,z)函数
Warren LaFrance

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

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


10

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

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

我不明白这个答案。给定的SQL结果为10.01,这是将10.0055正确舍入到两位小数的位置。如果最终参数不为0,则该值将被截断(小数点后2位)为10.00。
8128

7

回合具有可选参数

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

3
选择回合(123.456,2,1)将= 123.450
比克拉姆

4
我不明白为什么会这样。以上将分别给您123.450和123.460。
remykarem

7

您是否想要小数?

如果没有,请使用

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

如果您将其设为0,则进行一轮:

select round(@value,2)

1
抱歉,如果我不清楚,我需要保留小数位,只删除不想要的那些。例如,在上面的示例中,不是将123.456转换为123.46 ...,我想删除第三个小数点并将其设置为123.45。
瑞安·伊斯塔布鲁克

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

2
+1 Floor()是删除小数而不舍入的方法。太糟糕的Floor()没有第二个参数来指示在哪个位置。但是我认为* 10)/ 10确实可以很好地解决此问题。
deroby

4

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

SELECT ROUND(@val,0,1)

2
它不是。SELECT ROUND(123.4560,0,1)改为123.0000。
remykarem


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 
╚═════════╩═════════╝

备注:

我建议将内置ROUND函数的第3个参数设置为1。


1
ODBC标量函数-不同的选择!
Arulmouzhi

1

我知道这已经很晚了,但是我并没有将其视为答案,并且已经使用了多年了。

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

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

它将自动将舍入调整为所需的正确值。

顺便说一句,您是否正在从电影Office Space中重新创建程序?


0

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

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

select @val

输出为123.46


1)第3行是完全不必要2),他明确表示,他不想圆的数量,但截断它(的结果应该是123.45)
的Damián巴勃罗·冈萨雷斯

0

我认为您只需要十进制值,在这种情况下,您可以使用以下代码:

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

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

0

我知道这个问题确实很老,但是没有人使用子字符串来取整。这样做的优点是可以舍入非常长的数字(SQL Server中字符串的限制,通常为8000个字符):

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

0

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

问题陈述:从STATION查询北纬最大值(LAT_N)小于137.2345。将答案截断到小数点后4位。

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

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



-5
select convert(int,@value)

1
这不是OP想要的。他仍然想要小数位,但他想删除它们(舍入)而不是四舍五入。IE 123.456-> 123.45 NOT 123.456-> 12.46和NOT 123.456-> 123
John
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.