【发布时间】:2019-09-09 04:54:34
【问题描述】:
我有两个变量:
var elems;
var limit;
两者都可以是任意随机整数。
所以想象一下 elems = 5 和 limit = 3,而 elems / limit 给了我们一组盒子。
如果 elems 是 limit 的倍数,那么我们只会得到“完整的盒子”,否则,if limit < elems 我们会得到一个额外的“不完整的盒子”。 If limit > elems,那我们当然只能得到“一整盒”。
例如(5 / 3):
total elems: 5
limit: 3
offset: 0 3
box number: [0] [1]
elems contained: 3 2
offset = box number * limit
在这个例子中,盒子偏移量 3 是“不完整盒子”,盒子偏移量 0 是完整盒子。
我想找到最大偏移量,对于给定任意数量的元素和任意数量的限制的任何情况。以最简单的形式,问题是找到最快的方法来限制在任何位置有任何小数的任何数字,以适合查找最大偏移量的方式问题。
到目前为止,我已经提出了以下解决方案:
maxOffset = ((elems / limit - 1 | 0) + Math.ceil((elems % limit) / limit)) * limit;
maxOffset = Math.abs(Math.ceil((elems / limit) - 1) * limit);
maxOffset = (elems === limit) ? 0 : (1 === limit) ? (elems - 1) : (elems / limit >> 0) * limit;
但是,我正在寻找更优雅的解决方案。我在想也许:
maxOffset = ((elems / limit) - 1E-16 | 0) * limit;
但我不确定大数字到底会发生什么(我假设它会失败?),如果 1E-16 实际上是任何浮点数可以具有的最小十进制数。
这根本不是家庭作业,我只是一个业余程序员,我正在尝试为我正在编写的 CMS 解决这个问题。我希望我说清楚了,谢谢。
【问题讨论】:
-
使用Math.ceil有什么问题?
| 0有效地降低了价值。 -
没什么,我只是想找到最有趣的方式。 :p 是的,但事情是调整整个事情以找到最大偏移量。例如,如果 |如果使用 0,则必须添加测试以防 lim === lim 或 1 === lim。
-
我不知道您要达到什么目的,也不知道您如何计算偏移量。
Math.ceil(5/3)是 2,从哪里来的 3?一个简单的 ceil 函数是:function ceil(n) {return (n | 0) + (n%1? (n < 0? -1 : 1) : 0);},尽管这可能不是您想要的。 -
嗯,基本上,我想“计算”限制在 elems 中适合多少次,无论它是否“完全适合”。 Math.ceil(5/3) 确实返回 2,如果你以某种方式看待它,那就是限制适合 elems 的次数。但是偏移量必须从 0 开始,因此我从该结果中减去 -1,所以我可以稍后将它乘以限制,以获得正确的“最大”偏移量。 Math.ceil((elems / limit) - 1) * limit 是这样做的最明显的例子,这就是为什么当 elems 为 5 时它返回 3。我可以用你给我的上限函数代替 Math.ceil 并测试性能,谢谢。
-
我希望 Math.ceil 更快,因为我总是发现条件运算符 (
? :) 比等效的 if..else 循环慢,但是对于简单的表达式,它可以更具可读性。
标签: javascript math ceil