You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL中使用CEILING与除法函数计算糖果包装数的语法问题

解决SQL中CEILING除法计算糖果包装数的问题

嘿,我一眼就看出问题所在了——这是整数除法的特性在给你捣乱!

你当前的SQL语句select CEILING(NoOfSweets / SweetsPerPack) AS NoOfPacks之所以不符合预期,是因为当两个整数相除时,SQL会直接返回整数结果(截断小数部分),而不是浮点数。举个例子:

  • 5 / 10在整数除法里结果是0,再套上CEILING()还是0,但你需要的是1
  • 7 / 5整数除法结果是1CEILING(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.5CEILING(0.5) = 1
  • 7*1.0/5 = 1.4CEILING(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

NoOfSweetsSweetsPerPackRequiredOutCome计算后NoOfPacks
101011
51011
201022
81011
7522

内容的提问来源于stack exchange,提问作者Stanton Roux

火山引擎 最新活动