Более краткий способ округлить 0,5 и ниже до нуля? - PullRequest
0 голосов
/ 30 мая 2018
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 голосов
/ 30 мая 2018

Вы можете использовать третий параметр ROUND в сочетании с CASE:

ROUND (числовое выражение, длина [, функция] )

Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Если указано значение, отличное от 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

0 голосов
/ 30 мая 2018

Обычно округляют число, но вычитают .5, если его остаток при делении на 1 равен .5:

select
  round(case when v % 1 = .5 then v - .5 else v end, 0)
0 голосов
/ 30 мая 2018

как насчет этого

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