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

Rya*_*ook 184 sql t-sql sql-server rounding

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

declare @value decimal(18,2)

set @value = 123.456
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*tis 259

ROUND ( 123.456 , 2 , 1 )
Run Code Online (Sandbox Code Playgroud)

当第三个参数!= 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指定的小数位数.当length为负数时,numeric_expression在小数点的左侧舍入,由length指定.

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


Jim*_*mmy 180

select round(123.456, 2, 1)
Run Code Online (Sandbox Code Playgroud)

  • 答案应该解释函数的参数是什么 (23认同)
  • SQL ROUND(数字,小数,运算):运算->如果为0,则将结果舍入为小数位数。如果另一个值不为0,则会将结果截断为小数位数。默认为0 (5认同)

小智 31

SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Run Code Online (Sandbox Code Playgroud)


小智 13

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

select 100.0019-(100.0019%.001)
Run Code Online (Sandbox Code Playgroud)

返回100.0010

你的例子:

select 123.456-(123.456%.001)
Run Code Online (Sandbox Code Playgroud)

返回123.450

现在,如果你想摆脱结束零,只需投下它:

select cast((123.456-(123.456%.001)) as decimal (18,2))
Run Code Online (Sandbox Code Playgroud)

返回123.45


小智 9

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

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Run Code Online (Sandbox Code Playgroud)


小智 8

Round有一个可选参数

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这会得到提升.以上内容分别为123.450和123.460. (4认同)
  • 选择圆形(123.456,2,1)将= 123.450 (3认同)

小智 7

ROUND(number, decimals, operation)
Run Code Online (Sandbox Code Playgroud)

数字 => 必填。要四舍五入的小数位数
=> 必填。将数字舍入到运算的小数位数
=> 可选。如果为 0,则将结果四舍五入到小数位数。如果另一个值不为 0,则会将结果截断为小数位数。默认值为 0

ROUND(number, decimals, operation)
Run Code Online (Sandbox Code Playgroud)

会给你235.410

SELECT ROUND(235.415, 2, 1)
Run Code Online (Sandbox Code Playgroud)

会给你235.000

但现在修剪0你可以使用cast

SELECT ROUND(235.415, 0, 1)
Run Code Online (Sandbox Code Playgroud)

会给你235


SQL*_*ace 6

你想要小数吗?

如果没有,请使用

select ceiling(@value),floor(@value)
Run Code Online (Sandbox Code Playgroud)

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

select round(@value,2)
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 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
Run Code Online (Sandbox Code Playgroud)

  • `Floor()`的+1,这是删除小数而不进行舍入的方法.太糟糕了Floor()没有第二个参数来指示在哪个位置.但我认为*10)/ 10确实很好地解决了这个问题. (2认同)