在SQL Server 2008中舍入十进制数

时间:2014-01-12 06:59:03

标签: sql-server tsql rounding

我读过T-SQL的所有舍入函数,例如RoundFloorCeil,但它们都没有为我正确舍入十进制数。

我有两个问题:

  1. 如何舍入十进制数(3.69 ==> 3.5)?
  2. 如何对整数的最后3位进行舍入(例如142600 ==> 143000)?

3 个答案:

答案 0 :(得分:6)

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 FLOORCASTdecimal提供示例的在线参考资料。

2) select ROUND(142600, -3)处理第二种情况。

类似的在线参考可用于T-SQL ROUND

答案 1 :(得分:1)

根据@ J0e3gan的anwser,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

round(X / N) * N

然而,通常,使用简单的基于1的舍入函数 - 例如(Sql Round with Length = 0)舍入到“最近N”的任意值 - 使用公式:

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

e.g。最近的100

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

select round(5.123 / .02, 0) * .02 -- 5.12
select round(-9.871 / .02, 0) * .02 -- -9.88

......最近0.02

{{1}}

请记住,用于除数的类型必须是数字/小数或浮点数。

答案 2 :(得分:0)

Oracle / PLSQL FLOOR函数返回等于或小于数字的最大整数值。 例如:

FLOOR(7.9)
Result: 7

FLOOR(30.29)
Result: 30

FLOOR(-7.9)
Result: -8