【问题标题】:Calculating amount of available slots to fill计算要填充的可用插槽数量
【发布时间】:2019-02-08 00:26:13
【问题描述】:

想象一下,我有一个 4x5 的容器,里面有 20 个可用的插槽。在这个容器中,我有 13 个正方形和 7 个圆形:

但现在容器缩小到 3x3,只有 9 个可用插槽。

我想在这个较小的容器内显示相同比例的正方形和圆形,每个容器的最后一个是剩余的一堆物品。

现在,我将每种类型项目的计数除以所有项目的总计数,得到该类型占总计数的百分比值,然后将其乘以容器大小:

const percentage = typeCount / totalCount;
const spaceUnrounded = percentage * availableSlots;

所以这不是问题。当我需要将其四舍五入以获得正确数量的插槽时,问题就出现了。现在我正在寻找价值的底线:

const space = Math.floor(spaceUnrounded);

但这会导致项目留下 1 个空格。我还尝试找到第一种类型的值的上限,然后找到其余类型的下限:

const space = index === 0 ? Math.ceil(spaceUnrounded) : Math.floor(spaceUnrounded);

但这可能会导致项目增加 1 个额外的空间,具体取决于项目类型的数量。

Math.round 有同样的问题。

我可以在这里做什么?

编辑:我的预期输出可能是 6 个正方形和 3 个圆形,因为 13 是 20 的 65%,而 9 的 65% 是 5.85:

【问题讨论】:

  • 您的预期输出是什么,例如上图?
  • 问题是在你上面的例子中,你有偶数个正方形。在您想要的输出中,您有奇数个正方形。您需要确定如何处理这个额外的正方形——您希望它是正方形还是圆形?
  • 更新了预期的输出。 @ObsidianAge - 正方形永远不应该变成圆形。

标签: javascript math iteration


【解决方案1】:

选择您想要“权威”的数字(圆形或正方形,无所谓),然后从插槽总数中减去该数字以获得另一个数字。

> slots = 20
> squares = 13
> circles = 7
> newslots = 9
> newsquares = Math.round(newslots/slots*squares)
6
> newcircles = newslots - newsquares
3

【讨论】:

  • 这在只有 2 种类型时有效,但也有可能出现 3 种或更多。这将如何与n 类型数量一起使用?
  • 假设你有 N 个形状:(n=1,2,3, N)。然后n<N 使用newshapes[n] = Math.round(newslots/slots*shapes[n]) 和shape[N] 使用newshape[N] = newslots - sum(newshapes[n<N])。
  • 刚开始尝试这个——效果很好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多