【问题标题】:Fastest way to ceil any decimal number限制任何十进制数的最快方法
【发布时间】: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


【解决方案1】:

看看你的例子,你想要

maxOffset = limit * Math.floor((elems - 1) / limit);

因为这是任何框的 first 元素的最大索引。对于limit = 3,您在{0, 1, 2} 中获得maxOffset == 0 对于elems,对于{3, 4, 5} 中的elems 获得maxOffset == 1,依此类推。如果你的整数是非负数,我可以这样写

maxOffset = limit * (((elems - 1) / limit) | 0);

要学习的一课:不要从分数中减去一些浮点偏移,而是从分子中减去一个整数偏移,这样您就可以完全停留在整数运算中,JS 引擎可能会利用它来获得更高的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2011-03-08
    相关资源
    最近更新 更多