我试图确定最好的方式来截断或放额外的小数位SQL没有四舍五入。例如:

declare @value decimal(18,2)

set @value = 123.456

这将自动轮 @value123.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

语法

圆(numeric_expression,长度[、功能])

参数

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

  • 是的精度,这numeric_expression是圆。长度必须是一个表达的类型指定列的值、smallint,或int。当长是正数,numeric_expression是四舍五入到小数位指定的长度。当时的长度是一个负数,则将numeric_expression在左边的小数点,作为指定的长度。

  • 功能 是一种类型的操作,以执行。功能,必须指定列的值、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

实际上任何第三个参数是0或1或2,这不会轮值。

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

圆形的有个可选择的参数

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

另一个截断与有四舍五入的方案和范例。

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

如果你这样做是有0然后做一个圆形:

select round(@value,2)

这将消除小数部分的任何数量

SELECT ROUND(@val,0,1)

我知道这很晚了但我没看见它作为一个答案,并且已经用这一招对年。

简单地减为.005从你的价值和使用轮(@num,2).

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

它会自动调整四舍五入到正确的价值。

顺便说一下,是你重新程序的影办公室空间?

请尝试使用这个代码转换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 ║
╚═════════╩═════════╝

注:

我建议使用内 ROUND 功能,与第3参数设置1。

我知道这个问题真的很老但没有人使用的子串回合。此作为优势的能力来圆真的很长的数字(限制你串在SQL服务器,这通常是8000人物):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top