SQL Server中CEILING函数返回异常:如何使CEILING(2/10)返回1?
解决CEILING(2/10)返回0而非1的问题
哦,这个坑我之前踩过!问题出在整数除法的截断规则上——当你用两个整数做除法时,绝大多数SQL数据库(比如MySQL、SQL Server、PostgreSQL默认模式)都会直接砍掉小数部分,只返回整数结果。所以2/10实际计算出来是0,再套上CEILING()自然就返回0了,完全符合数据库的运算逻辑,但不是你想要的结果。
要让这个语句返回1,有几种简单的解决办法:
让除法运算产生浮点数结果:
只需要把其中一个操作数改成浮点数/小数形式就行,比如:SELECT CEILING(2.0/10); -- 或者 SELECT CEILING(2/10.0);这样数据库会按浮点数规则计算,
2.0/10得到0.2,CEILING(0.2)就会返回1。显式转换数据类型:
如果不想直接写小数,可以用类型转换函数强制把整数转成非整数类型,比如:
-- MySQL 示例SELECT CEILING(CAST(2 AS DECIMAL)/10);-- SQL Server 示例
SELECT CEILING(CONVERT(FLOAT, 2)/10);整数运算的向上取整技巧:
要是你只想用整数运算(避免浮点数精度问题),可以用这个经典公式:CEILING(a/b) = (a + b - 1) // b(整数除法)。对应到你的场景就是:SELECT (2 + 10 - 1)/10; -- 或者套CEILING也可以,结果一样 SELECT CEILING((2 + 10 - 1)/10);原理是给被除数加上除数减1,再做整数除法,相当于把小数部分“进位”,最终结果就是向上取整后的整数。
不同数据库可能在语法细节上有小差异,但核心思路都是一致的:要么让除法得到带小数的结果,要么用整数运算的向上取整公式绕过截断问题。
内容的提问来源于stack exchange,提问作者Sabyasachi Mukherjee
相关产品推荐
相关产品推荐

