【发布时间】: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
我想对5.457845 的十进制值进行四舍五入。
5,则5.5
5,则5.0
例如:
5.457845 = 5.0
5.684575 = 5.5
【问题讨论】:
标签: sql sql-server tsql decimal rounding
这个怎么样:
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
【讨论】:
select convert(decimal(9,1), floor(5.457845 * 2) / 2)。但通常查询中的输出数字是什么样子并不重要,因为您应该尽可能在 UI 层而不是在这里进行格式化以提高可读性。
我认为没有任何本机功能可以做到这一点。试试这个技巧
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
【讨论】: