如何对小数前的数字向上取整?解决SQL算术溢出转换错误
实现小数前数字向上取整的方法及溢出问题解决
先解决算术溢出错误
你碰到的溢出问题原因很清楚:@x的类型是decimal(22,10),说明它总位数是22,其中小数位占10位,所以整数部分最多能存12位数字;而@y是decimal(20,10),整数部分最多只能存10位,你的原数整数部分是12位的234323154322,明显超出了@y的容量,导致转换时溢出。
解决办法很简单,把@y的类型改成能容纳足够整数位的decimal类型就行,比如decimal(22,10)或者如果只需要存整数就用decimal(22,0)。
实现小数前数字向上取整
要对小数前的整数部分向上取整,本质就是对整个数值取大于等于它的最小整数,SQL里直接用CEILING()函数就能实现,同时注意数据类型匹配:
示例代码
-- 定义原变量,确保类型能容纳目标数值 Declare @x decimal(22,10)='234323154322.6787654321' -- 向上取整后得到整数,用足够容量的类型存储 Declare @y decimal(22,0)=CEILING(@x); SELECT @y; -- 执行结果为234323154323
补充说明
- 如果原数值是负数,
CEILING()会返回大于等于该数的最小整数,比如CEILING(-123.45)会得到-123,这完全符合向上取整的定义。 - 要是你想单独提取整数部分再手动处理(其实和直接用
CEILING()效果一致),可以在小数部分大于0时用FLOOR(@x)+1,但显然CEILING()是更标准直接的写法。
内容的提问来源于stack exchange,提问作者TechChoice
相关产品推荐
相关产品推荐

