【问题标题】:Truncate (not round) decimal places in SQL Server在 SQL Server 中截断(不是四舍五入)小数位
【发布时间】:2010-09-07 19:50:42
【问题描述】:

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

declare @value decimal(18,2)

set @value = 123.456

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

【问题讨论】:

    标签: sql sql-server tsql rounding


    【解决方案1】:

    如果您希望通过简单地省略不需要的小数位来获取89.0904987 之类的数字并将其转换为89.09,只需使用以下命令:

    select cast(yourColumnName as decimal(18,2))
    

    以下截图来自W3Schools SQL Data Types部分,描述了decimal(18,2)在做什么:

    因此,

    select cast(89.0904987 as decimal(18,2))
    

    给你:89.09

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

        【解决方案3】:

        试试这样:

        SELECT cast(round(123.456,2,1) as decimal(18,2)) 
        

        【讨论】:

          【解决方案4】:
          SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;
          

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

          【讨论】:

          • 我不认为这是正确的 考虑以下情况并注意结果是四舍五入而不是截断。 OP希望它被截断。 ` DECLARE @N1 AS DECIMAL(10,7) = 123.1234789 ` PRINT @N1 ` SELECT CAST(@N1 AS DECIMAL(10,4))
          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:
            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 指定的小数位数。当length为负数时,numeric_expression在小数点左侧四舍五入,由length指定。

            • function 是要执行的操作类型。函数必须是 tinyint、smallint 或 int。当 function 被省略或值为 0(默认)时,numeric_expression 被舍入。指定 0 以外的值时,numeric_expression 将被截断。

            【讨论】:

            • 有人知道函数参数的哪些值对应于 tinyint、smallint 和 int 吗?微软将这部分从他们的文档中遗漏了,并且无法在任何地方找到答案。 msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
            • MS SQL SERVER 对数字的舍入与 IQ 略有不同。要修复使用这样的 round(x,y,z) 函数 round(val1/val2,4,1)
            【解决方案7】:
            select round(123.456, 2, 1)
            

            【讨论】:

            • 答案应该说明函数的参数是什么
            • SQL ROUND(number, decimals, operation) : operation --> 如果为 0,则将结果四舍五入为小数位数。如果另一个值不是 0,它会将结果截断为小数位数。默认为 0
            • 你是救命稻草,我只能显示最后两位数字“1.9991666”,但无论我使用什么,它总是四舍五入为 2,这样我就可以实现类似这 - 选择 FORMAT(round(1.9991666, 2, 1),'N2') AS 'Rate',谢谢队友
            • 例如:它不返回值:123.45,而是返回值 123.450。请建议和帮助。我正在使用 SQL 14
            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              你的例子:

              declare @num decimal(9,5) = 123.456
              
              select round(@num-.005,2)
              

              返回 123.45

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

              顺便问一下,你是从电影《办公空间》中重新制作程序吗?

              【讨论】:

                【解决方案10】:

                另一种方式是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。

                【讨论】:

                • ODBC 标量函数 - 不同的选择!
                【解决方案11】:

                其实不管第三个参数是0还是1还是2,它都不会四舍五入你的值。

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

                【讨论】:

                • 我不明白这个答案。给定的 SQL 结果为 10.01,这是 10.0055 到小数点后两位的正确舍入。如果最终参数不为 0,则将值截断(保留 2 位小数)为 10.00。
                【解决方案12】:

                你要不要小数?

                如果没有,请使用

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

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

                select round(@value,2)
                

                【讨论】:

                • 对不起,如果我不清楚,我需要保留小数位,只删除我不想要的那些。例如,不是将上面示例中的 123.456 转换为 123.46...我想去掉第三个小数并使其变为 123.45。
                【解决方案13】:

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

                SELECT ROUND(@val,0,1)
                

                【讨论】:

                • 它没有。 SELECT ROUND(123.4560,0,1) 给你 123.0000 代替。
                【解决方案14】:

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

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

                【讨论】:

                  【解决方案15】:
                  SELECT Cast(Round(123.456,2,1) as decimal(18,2))
                  

                  【讨论】:

                    【解决方案16】:

                    Round 有一个可选参数

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

                    【讨论】:

                    • 选择回合(123.456, 2, 1)将 = 123.450
                    • 我不明白为什么这会得到支持。以上将分别给你 123.450 和 123.460。
                    【解决方案17】:

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

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

                    输出为 123.46

                    【讨论】:

                    • 1) 第 3 行完全没有必要 2) 他明确表示他不想四舍五入,而是截断它(结果应该是 123.45)
                    【解决方案18】:

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

                    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

                    【讨论】:

                      【解决方案19】:

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

                      【讨论】:

                        【解决方案20】:

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

                            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 for Floor() 这是在不四舍五入的情况下去掉小数的方法。太糟糕了 Floor() 没有第二个参数来指示在哪个位置。但我认为 * 10) / 10 确实可以很好地解决这个问题。
                        【解决方案21】:
                        select convert(int,@value)
                        

                        【讨论】:

                        • 这不是 OP 想要的。他仍然想要小数位,但他想要删除它们(截断)而不是四舍五入。 IE。 123.456 -> 123.45 不是 123.456 -> 12.46 和不是 123.456 -> 123
                        猜你喜欢
                        • 1970-01-01
                        • 2011-03-09
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-12-27
                        • 2011-05-10
                        • 2017-01-29
                        相关资源
                        最近更新 更多