【问题标题】:SQL Server custom rounding of decimal valueSQL Server 自定义四舍五入的十进制值
【发布时间】:2017-06-15 05:37:42
【问题描述】:

我想对5.457845 的十进制值进行四舍五入。

  • 如果小数点后的第一个数字值大于5,则5.5
  • 如果小数点后的第一个数字值小于5,则5.0

例如:

5.457845 = 5.0
5.684575 = 5.5

【问题讨论】:

    标签: sql sql-server tsql decimal rounding


    【解决方案1】:

    这个怎么样:

    select floor(5.457845 * 2) / 2  -- returns 5.0
    select floor(5.684575 * 2) / 2  -- returns 5.5
    select floor(5.0 * 2) / 2       -- corner case 1 - returns 5.0
    select floor(5.4999999 * 2) / 2 -- corner case 2 - returns 5.0
    select floor(5.5 * 2) / 2       -- corner case 3 - returns 5.5
    select floor(5.9999999 * 2) / 2 -- corner case 4 - returns 5.5
    

    请注意,这可能不适用于负数:

    select floor(-5.0 * 2) / 2       -- corner case 5 - returns -5.0
    select floor(-5.4999999 * 2) / 2 -- corner case 6 - returns -5.5
    select floor(-5.5 * 2) / 2       -- corner case 7 - returns -5.5
    select floor(-5.9999999 * 2) / 2 -- corner case 8 - returns -6.0
    

    【讨论】:

    • 这是有效的,但它显示的结果像 5.500000 但我想要 5.5
    • 抱歉,试试这样的select convert(decimal(9,1), floor(5.457845 * 2) / 2)。但通常查询中的输出数字是什么样子并不重要,因为您应该尽可能在 UI 层而不是在这里进行格式化以提高可读性。
    【解决方案2】:

    我认为没有任何本机功能可以做到这一点。试试这个技巧

    DECLARE @num NUMERIC(22, 6) = 5.684575
    
    SELECT Floor(@num) + CASE WHEN Round(@num, 1, 1) % 1 <= 0.5 THEN 0 ELSE 0.5 END
    

    结果: 5.5

    如果数字可以是负数,那么您需要在 ROUND 函数之上使用 ABS 函数

    ABS(Round(@num, 1, 1)) % 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多