【问题标题】:Rounding down decimal numbers in SQL Server 2008在 SQL Server 2008 中舍入小数
【发布时间】:2014-01-12 06:59:02
【问题描述】:

我阅读了 T-SQL 的所有四舍五入函数,例如 RoundFloorCeil,但没有一个对我来说正确舍入小数。

我有两个问题:

  1. 如何将小数四舍五入 (3.69 ==> 3.5)?
  2. 如何将整数的最后 3 位四舍五入(例如 142600 ==> 143000)?

【问题讨论】:

  • 你应该写 udf。

标签: sql-server tsql rounding


【解决方案1】:

1) select CAST(FLOOR(2 * 3.69) / 2 AS decimal(2, 1)) 处理第一种情况 - 由 answer to a similar question on SQL Server Forums 提供,我对其进行了调整并快速检查。

请注意,如果四舍五入到最接近的 0.5 的数字可能更大(例如 333.69 => 333.5),请务必在转换时指定更多 decimal 精度(例如 select CAST(FLOOR(2 * 3.69) / 2 AS decimal(10, 1))) , 或者你会得到一个溢出错误:

Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting numeric to data type numeric.

额外的精度不会影响底线结果(即select CAST(FLOOR(2 * 3.69) / 2 AS decimal(10, 1))select CAST(FLOOR(2 * 3.69) / 2 AS decimal(2, 1))都产生3.5);但是如果你四舍五入的数字总是更小,那就太浪费了。

为 T-SQL FLOORCASTdecimal 提供了带有示例的在线参考以提供帮助。

2) select ROUND(142600, -3) 处理第二种情况。

类似的在线参考可用于 T-SQL ROUND

【讨论】:

  • 感谢 J0e3gan。它工作正常!
【解决方案2】:

根据 @J0e3gan 的回答,Sql Server's Round 允许使用 length 参数四舍五入到最接近的 10 次方,其中长度为 10^(-length),例如

length = 0 : 10 ^ 0 = nearest 1
length = 3 : 10 ^ -3 = nearest .001
length = -3 : 10 ^ 3 = nearest 1000

但是,一般来说,使用简单的基于 1 的舍入函数 - 例如(Sql Round with Length=0)四舍五入到“最近N”的任意值 - 使用公式:

round(X / N) * N

例如最接近的 100

select round(12345 / 100.0, 0) * 100.0 -- 12300
select round(-9876 / 100.0, 0) * 100.0 -- -9900
select round(-9849 / 100.0, 0) * 100.0 -- -9800

...最近的 0.5

select round(5.123 / 0.5, 0) * 0.5 -- 5.000
select round(6.499 / 0.5, 0) * 0.5 -- 6.500
select round(-4.499 / 0.5, 0) * 0.5 -- -4.50

...最近的 0.02

select round(5.123 / .02, 0) * .02 -- 5.12
select round(-9.871 / .02, 0) * .02 -- -9.88

请记住,用于除数的类型必须是数字/小数或浮点数。

【讨论】:

    【解决方案3】:

    Oracle/PLSQL FLOOR 函数返回等于或小于数字的最大整数值。 例如:

    FLOOR(7.9)
    Result: 7
    
    FLOOR(30.29)
    Result: 30
    
    FLOOR(-7.9)
    Result: -8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多