我有两个变量:
var elems;
var limit;
两者都可以是任意随机整数。
想象一下elems = 5和limit = 3,elems / limit给我们一组方框。
如果elems是限制的倍数,那么我们将只获得#34;完整的框&#34;否则,if limit < elems
我们将获得一个额外的&#34;不完整的框&#34;。 If limit > elems
,当然我们只能获得一个完整的框&#34;。
例如(5/3):
total elems: 5
limit: 3
offset: 0 3
box number: [0] [1]
elems contained: 3 2
offset = box number * limit
在此示例中,框偏移3是&#34;不完整的框&#34;和框偏移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解决这个问题。我希望我很清楚,谢谢你。
答案 0 :(得分:1)
看看你的例子,你想要
maxOffset = limit * Math.floor((elems - 1) / limit);
因为它是任何框的第一个元素的最大索引。对于limit = 3
来说,{{1,}} maxOffset == 0
elems
maxOffset == 1
{{4}} elems
等等。如果你的整数是非负的,我可以把它写成
maxOffset = limit * (((elems - 1) / limit) | 0);
要学习的课程:不是从分数中减去一些浮点偏移量,而是从分子中减去一个整数偏移量,而你可以完全保留整数算术,JS引擎可能会利用它来获得更高的性能。