最快的方式来细化任何十进制数

时间:2015-02-14 22:06:36

标签: javascript math ceil

我有两个变量:

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解决这个问题。我希望我很清楚,谢谢你。

1 个答案:

答案 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引擎可能会利用它来获得更高的性能。