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

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

Truncate (not round) decimal places in SQL Server

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

1
2
3
DECLARE @VALUE DECIMAL(18,2)

SET @VALUE = 123.456

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


1
ROUND ( 123.456 , 2 , 1 )

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

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

句法

1
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被截断。

1
SELECT round(123.456, 2, 1)


1
SELECT CAST(Round(123.456,2,1) AS DECIMAL(18,2))

这是我能够截断而不是四舍五入的方法:

1
SELECT 100.0019-(100.0019%.001)

返回100.0010

和你的例子:

1
SELECT 123.456-(123.456%.001)

返回123.450

现在,如果您想摆脱结尾的零,只需将其强制转换为:

1
SELECT CAST((123.456-(123.456%.001)) AS DECIMAL (18,2))

返回123.45


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

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

回合具有可选参数

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


您是否想要小数?

如果没有,请使用

1
SELECT CEILING(@VALUE),FLOOR(@VALUE)

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

1
SELECT round(@VALUE,2)

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

1
2
3
4
5
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

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

1
SELECT ROUND(@val,0,1)

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

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

你的例子:

1
2
3
DECLARE @num DECIMAL(9,5) = 123.456

SELECT round(@num-.005,2)

返回123.45

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

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


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

1
2
3
4
5
DECLARE @val DECIMAL (8, 2)
SELECT @val = 123.456
SELECT @val =  @val

SELECT @val

输出为123.46


1
SELECT CAST(VALUE AS DECIMAL(10,2)) FROM TABLE_NAME;

小数点后将为您提供2个值。 (MS SQL服务器)


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

1
2
3
4
DECLARE @val DECIMAL (8, 3)
SET @val = 123.456

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

另一种方法是ODBC TRUNCATE函数:

1
2
3
DECLARE @VALUE DECIMAL(18,3) =123.456;

SELECT @VALUE AS val, {fn TRUNCATE(@VALUE, 2)} AS RESULT

LiveDemo

输出:

1
2
3
4
5
╔═════════╦═════════╗
║   val   ║ RESULT  ║
╠═════════╬═════════╣
123,456123,450
╚═════════╩═════════╝

备注:

我建议将内置的ROUND函数与第三个参数设置为1一起使用。


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

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

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

Problem statement: Query the greatest value of the Northern Latitudes
(LAT_N) from STATION that is less than 137.2345. Truncate your answer
to 4 decimal places.

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

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


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


1
SELECT CONVERT(INT,@VALUE)

推荐阅读