SQL中使用CEILING与除法函数计算糖果包装数的语法问题
解决SQL中CEILING除法计算糖果包装数的问题
嘿,我一眼就看出问题所在了——这是整数除法的特性在给你捣乱!
你当前的SQL语句select CEILING(NoOfSweets / SweetsPerPack) AS NoOfPacks之所以不符合预期,是因为当两个整数相除时,SQL会直接返回整数结果(截断小数部分),而不是浮点数。举个例子:
5 / 10在整数除法里结果是0,再套上CEILING()还是0,但你需要的是17 / 5整数除法结果是1,CEILING(1)还是1,但正确结果应该是2
两种可行的解决方案
方案1:将整数转为浮点型后再计算
把其中一个运算数转换成浮点数(或小数类型),让除法运算返回带小数的结果,这样CEILING()就能正确向上取整了。比如:
SELECT CEILING(NoOfSweets * 1.0 / SweetsPerPack) AS NoOfPacks
或者用显式类型转换:
SELECT CEILING(CAST(NoOfSweets AS DECIMAL(10,2)) / SweetsPerPack) AS NoOfPacks
用你的测试数据验证:
5*1.0/10 = 0.5→CEILING(0.5) = 17*1.0/5 = 1.4→CEILING(1.4) = 2
完全符合你的预期结果!
方案2:用整数运算实现向上取整(避免浮点误差)
如果你担心浮点运算的精度问题,可以用纯整数公式来实现向上取整,公式是:(被除数 + 除数 - 1) // 除数(不同数据库里整数除法的符号可能是DIV或者直接/,取决于数据库类型)。
对应的SQL语句:
SELECT (NoOfSweets + SweetsPerPack - 1) DIV SweetsPerPack AS NoOfPacks
同样验证你的例子:
(5 + 10 -1) DIV 10 = 14 DIV10 =1(7 +5 -1) DIV5=11 DIV5=2
结果也完全正确,而且全程是整数运算,不会有浮点精度问题。
验证所有测试数据
用任意一种方案,你的测试数据都会得到正确的NoOfPacks:
| NoOfSweets | SweetsPerPack | RequiredOutCome | 计算后NoOfPacks |
|---|---|---|---|
| 10 | 10 | 1 | 1 |
| 5 | 10 | 1 | 1 |
| 20 | 10 | 2 | 2 |
| 8 | 10 | 1 | 1 |
| 7 | 5 | 2 | 2 |
内容的提问来源于stack exchange,提问作者Stanton Roux




