SQL Server自定义舍入十进制值

时间:2017-06-15 05:37:42

标签: sql sql-server tsql decimal rounding

我想围绕5.457845的小数值。

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

例如:

5.457845 = 5.0
5.684575 = 5.5

2 个答案:

答案 0 :(得分:1)

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

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

如果数字可能为负数,则需要在ABS函数

之上使用ROUND函数
ABS(Round(@num, 1, 1)) % 1

答案 1 :(得分: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