在MySQL查询中,将值四舍五入到最接近的2次方
我想在mysql查询中将一个值四舍五入到下一个最接近的2次方,所以在MySQL查询中,将值四舍五入到最接近的2次方,mysql,sql,Mysql,Sql,我想在mysql查询中将一个值四舍五入到下一个最接近的2次方,所以 select RoundUpToNearestPowerOfTwo(700) -- Should give 1024 我需要这个解决方案作为更大查询的一部分来生成和读取一些位掩码。使用自定义存储函数不是一个选项,因为我不能在我们的生产环境中使用这些函数,所以我正在寻找一种在查询中内联使用这些函数的智能方法 [编辑] 我能想到的一种可能的方法是创建一些枚举数,在其中使用幂,然后选择比我的值大的最小值: select
select RoundUpToNearestPowerOfTwo(700) -- Should give 1024
我需要这个解决方案作为更大查询的一部分来生成和读取一些位掩码。使用自定义存储函数不是一个选项,因为我不能在我们的生产环境中使用这些函数,所以我正在寻找一种在查询中内联使用这些函数的智能方法
[编辑]
我能想到的一种可能的方法是创建一些枚举数,在其中使用幂,然后选择比我的值大的最小值:
select
min(BOUND)
from
(select 700 as VALUE) v
inner join
(select
POW(2, @pow := @pow + 1) as BOUND
from
(select @pow := 0) x,
MY_RANDOM_TABLE t
) x on x.BOUND > v.VALUE
但正如您所知,它非常冗长,因此欢迎使用更精简的解决方案 试试这个:
select power(2, 1 + floor(log2(XXX)))
MySQL方便地拥有log2()
函数,它完成了大部分工作
编辑:
我想这可能是你想要的:
select (case when floor(log2(XXX)) <> log2(XXX)
then power(2, 1 + floor(log2(XXX)))
else power(2, floor(log2(XXX)))
end)
实际幂为2时有一个边界条件。试试这个
FLOOR(POW(2,CEIL(LOG2(1025))))
天花板和地板正确地处理边界条件。如果您使用的是SQL Server,那么您可以尝试此操作……只需将变量@value中的值更改为任意值,即可获得下一个最接近的2次方
declare @count int = 1
declare @value int = 700
while (@value <> 1)
BEGIN
set @value = @value / 2
set @count = @count + 1
END
select power(2, @count)
declare@count int=1
声明@value int=700
而(@value 1)
开始
设置@value=@value/2
设置@count=@count+1
结束
选择电源(2,@count)
非常好,先生。:)我很乐意尽快接受这个答案。当然,除非有人会带来更天才的解决方案第一个解决方案看起来非常精简,但确实存在一个问题,即精确值1024将导致2048。我认为这对我来说不是问题,但如果事实证明是,我会让其他人作为后备。事实证明,边界条件是由于1+楼层
,而应该是ceil
。@GolezTrol。实际上,原始查询没有指定在边界情况下要做什么,示例代码具有x.BOUND>v.VALUE
,这表明1+floor()
是等效代码。然而,在这种情况下,舍入16到32违反了常识。你是对的。我没有正确地定义它。样本只是一些我没有完全测试过的一般想法。我必须承认,我并没有真正考虑边界条件,我也不认为它对我的特殊目的有多重要。我主要需要它,因为我需要在一个大的数字中存储多个数字来创建一些位模式,所以最坏的情况是,我会在该模式中有一个额外的未使用位。这里真的需要FLOOR()
吗?也很整洁。但看起来你根本不需要地板。毕竟,您已经对log2
的分数结果进行了四舍五入,当N为整数时,POW(2,N)不应该有分数。实际上不需要下限。如果你愿意的话,可以叫我数字noodge,但我经常被双精度到整数转换的默认值所困扰,我很难想象不指定它。
declare @count int = 1
declare @value int = 700
while (@value <> 1)
BEGIN
set @value = @value / 2
set @count = @count + 1
END
select power(2, @count)