【发布时间】:2014-01-12 06:59:02
【问题描述】:
我阅读了 T-SQL 的所有四舍五入函数,例如 Round、Floor 和 Ceil,但没有一个对我来说正确舍入小数。
我有两个问题:
- 如何将小数四舍五入 (
3.69==>3.5)? - 如何将整数的最后 3 位四舍五入(例如
142600==>143000)?
【问题讨论】:
-
你应该写 udf。
标签: sql-server tsql rounding
我阅读了 T-SQL 的所有四舍五入函数,例如 Round、Floor 和 Ceil,但没有一个对我来说正确舍入小数。
我有两个问题:
3.69 ==> 3.5)?142600 ==> 143000)?【问题讨论】:
标签: sql-server tsql rounding
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 FLOOR、CAST 和 decimal 提供了带有示例的在线参考以提供帮助。
2) select ROUND(142600, -3) 处理第二种情况。
类似的在线参考可用于 T-SQL ROUND。
【讨论】:
根据 @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
等
请记住,用于除数的类型必须是数字/小数或浮点数。
【讨论】:
Oracle/PLSQL FLOOR 函数返回等于或小于数字的最大整数值。
例如:
FLOOR(7.9)
Result: 7
FLOOR(30.29)
Result: 30
FLOOR(-7.9)
Result: -8
【讨论】: