210

我正在尝试确定在不四舍五入的情况下截断或删除 SQL 中多余小数位的最佳方法。例如:

declare @value decimal(18,2)

set @value = 123.456

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

4

21 回答 21

298
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。当 function 被省略或值为 0(默认)时,numeric_expression 被舍入。当指定 0 以外的值时,numeric_expression 将被截断。
于 2008-09-04T16:11:32.783 回答
203
select round(123.456, 2, 1)
于 2008-09-04T15:54:24.090 回答
44
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
于 2009-05-05T19:58:28.967 回答
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

于 2009-02-12T22:54:22.717 回答
13

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

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
于 2013-12-31T13:40:16.753 回答
8

你想要小数还是不想要?

如果没有,请使用

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

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

select round(@value,2)
于 2008-09-04T15:57:42.117 回答
7

Round 有一个可选参数

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
于 2009-11-12T22:33:24.257 回答
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
于 2009-02-12T23:03:33.707 回答
4

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

SELECT ROUND(@val,0,1)
于 2009-12-11T11:11:58.543 回答
3
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

会给你小数点后的 2 个值。(MS SQL 服务器)

于 2019-09-15T09:48:50.230 回答
3
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

于 2020-12-11T16:49:51.427 回答
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我建议使用将第三个参数设置为 1的内置函数。

于 2016-04-13T18:44:12.107 回答
1

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

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

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回 123.45

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

顺便问一下,您是从电影《办公空间》中重新创建程序吗?

于 2017-01-26T19:24:59.617 回答
1

试试这样:

SELECT cast(round(123.456,2,1) as decimal(18,2)) 
于 2020-10-03T11:15:01.707 回答
0

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

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

select @val

输出为 123.46

于 2009-07-01T07:09:37.410 回答
0

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

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

SELECT @val - ROUND(@val,0,1)
于 2009-11-20T11:16:17.937 回答
0

我知道这个问题真的很老,但没有人使用子字符串来四舍五入。这是对非常长的数字进行舍入的优势(SQL Server 中的字符串限制通常为 8000 个字符):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
于 2018-03-27T07:52:26.340 回答
0

我认为通过在 Hackerrank 中找到的更简单的示例解决方案,我们可以更轻松:

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

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

上面的解决方案让您了解如何简单地将值限制为 4 个小数点。如果您想降低或提高小数点后的数字,只需将 4 更改为您想要的任何值。

于 2019-09-02T15:42:25.630 回答
0

如果您希望通过简单地省略不需要的小数位来获取某个数字89.0904987并将其转换为,只需使用以下命令: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

于 2021-12-03T08:47:04.977 回答
-3

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

于 2009-10-21T22:02:01.247 回答
-5
select convert(int,@value)
于 2008-09-04T15:52:24.873 回答