更简洁的方法来绕0.5和零以下?

时间:2018-05-30 12:56:56

标签: sql-server rounding

SELECT ROUND(CAST(0.51 AS FLOAT), 0) AS FiveOne
     , ROUND(CAST(0.5 AS FLOAT), 0) AS Five
     , ROUND(CAST(0.4999999 AS FLOAT), 0) AS FourNine

FiveOne                Five                   FourNine
---------------------- ---------------------- ----------------------
1                      1                      0

如何将0.5和0.49999舍入为零(降至最接近的整数),但0.51回合为1? 我想我可以做到以下几点,但有更简洁的方法吗?

SELECT ROUND(CAST(0.51 AS FLOAT), 0) AS FiveOne
     , CASE WHEN CAST(0.5 AS FLOAT) <= CAST(0.5 AS FLOAT)
            THEN FLOOR(CAST(0.5 AS FLOAT))
            ELSE ROUND(CAST(0.5 AS FLOAT), 0)
       END AS Five
     , ROUND(CAST(0.4999999 AS FLOAT), 0) AS FourNine

FiveOne                Five                   FourNine
---------------------- ---------------------- ----------------------
1                      0                      0

3 个答案:

答案 0 :(得分:2)

这个怎么样

select  amt, ceiling(amt - 0.5)
from
(
    select  amt = 0.51  union all
    select  0.5     union all
    select  0.4999999   
) a

结果:

0.5100000   1
0.5000000   0
0.4999999   0

答案 1 :(得分:1)

正常舍入数字,但如果除以.5的余数为1,则减去.5

select
  round(case when v % 1 = .5 then v - .5 else v end, 0)

答案 2 :(得分:0)

您可以使用ROUND的第三个参数与CASE结合使用:

  

ROUND(numeric_expression,length [,function]

     

当省略函数或者值为0(默认值)时,numeric_expression会四舍五入。 当指定0以外的值时,将截断numeric_expression。

DECLARE @v DECIMAL(18,8) = 0.5;
SELECT ROUND(@v, 0, CASE WHEN @v %0.5 = 0 THEN 1 ELSE 0 END);

<强> DBFiddle Demo