首页 文章

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

提问于
浏览
172

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

declare @value decimal(18,2)

set @value = 123.456

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

16 回答

  • 8

    你想要小数吗?

    如果没有,请使用

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

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

    select round(@value,2)
    
  • 4

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

    SELECT ROUND(@val,0,1)
    
  • 9

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

    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

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

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

    Round有一个可选参数

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

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

    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
    
  • 235
    select round(123.456, 2, 1)
    
  • 169
    ROUND ( 123.456 , 2 , 1 )
    

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

    http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

    Syntax

    ROUND(numeric_expression,length [,function])

    Arguments

    • 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 .

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

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

    只需从您的值中减去.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

  • -3

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

    declare @val decimal (8, 3)
    SET @val = 123.456
    
    SELECT @val - ROUND(@val,0,1)
    
  • 5

    另一种方法是 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 .

  • 0

    我知道这个问题真的很老但没有人使用子字符串来回合 . 这有利于舍入真正长的数字(SQL服务器中字符串的限制,通常为8000个字符):

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

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

相关问题