如何将百分比计算为指数级数?

Posted

技术标签:

【中文标题】如何将百分比计算为指数级数?【英文标题】:How to calculate a percentage as an exponential progression? 【发布时间】:2019-07-30 19:09:19 【问题描述】:

我想做的很简单,但我想不出它的数学和代码。

我有一个百分比,我在控制台中显示为每个渐进步骤的新数字。所以我知道每一步的确切百分比 1-100。假设一个不断的进展,我想要的是只显示某个指数函数上的数字:

而不是显示:

1,2,3,4,5,6,7....100

我只想显示:

1,2,4,8,15,25,40,65,90,(100)

或者类似的东西。这个想法是显示初始活动,但很快就会降低垃圾邮件的百分比。

我该怎么做?我唯一能想到的是定义一个允许打印的固定数字数组(也许这是最好的解决方案?我觉得应该有一个更优雅的基于数学的解决方案)。嗯,或者也许使用指数函数/缓动曲线填充这样的数组。

添加一些关于如何获取百分比的信息:

for (int i = 0; i < batchjob.size(); i++) 
   int percent = 100 * i / batchjob.size();
   log.debug("Progress: / = %", i, batchjob.size(), percent));

现在我尝试了以下方法:

final Set<Integer> progressDisplay = newHashSet(1, 2, 4, 8, 15, 25, 40, 65, 90, 100);

for (int i = 0; i < batchjob.size(); i++) 
   int percent = 100 * i / batchjob.size();
   if (progressDisplay.contains(percent)) 
        log.debug("Progress: / = %", i, batchjob.size(), percent));
   

但是,这会导致如下结果:

1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,4,4,4,4,4,4,8,8,8 ,8,8,8,8...等


解决方案

我选择了接受的答案和固定数组的组合。我最终决定使用一个简单的数组,因为我可以更轻松地调整数字。

final int[] progressDisplay = 1, 3, 8, 20, 50, 75, 100;
int lastMatchingIndex = 0;

for (int i = 0; i < batchjob.size(); i++) 
    processBatchJob(batchjob.get(i));
    int percent = 100 * i / batchjob.size();
    if (progressDisplay[lastMatchingIndex] == percent) 
        log.debug("Progress: / = %", i, batchjob.size(), percent);
        lastMatchingIndex++;
    

【问题讨论】:

当安装程序显示稳定的增量进度,直到它卡在 60% 一段时间,然后突然跳到 90%,这是一个错误,不应该尝试实施:P跨度> 我同意@thatotherguy,但这是在终端上:)(但也许跳跃不需要那么大) 【参考方案1】:
//initial exponential function check
int baseNum = 2;
final int exponent = 3;
int check = Math.pow(baseNum, exponent);
for(int x = 1; x <= 100; x++)
    if(x == check)
        System.out.println(x);
        baseNum++;
        check = Math.pow(baseNum, exponent);
    

这只是一个例子;您没有为完整的解决方案提供足够的信息。但是,您应该能够应用这个想法:您可以应用指数函数一次,然后在迭代时检查函数的输出,并且 - 如果相同 - 重新应用指数函数并重复。

【讨论】:

其实这很简洁,因为它还解决了重复数字的问题(111,222,444,888 等)。我试试看!【参考方案2】:

如果你想保持简单,你总是可以只使用两个计数器,并根据每个循环迭代的计数器增加一个,这样每次跳转都会变大:

int j = 1, k = 1;
while (k < 100)

    System.out.println(k);
    j++;
    k = k + j;

如果你想降低跳跃频率,你可以将k = k + j 更改为k = k + j / 2; 或类似的东西。如果您想更快地打印更少的数字,请提高j 的增加速度。专门根据最适合您的方式进行调整。

【讨论】:

【参考方案3】:

您可以在 for 循环的增量参数中定义指数函数。以下是 x^2 的示例。

for(int x = 1; x <= 100; x*=2) 
    System.out.println(foo[x]); // 1/2/4/8/16/32/64

【讨论】:

以上是关于如何将百分比计算为指数级数?的主要内容,如果未能解决你的问题,请参考以下文章

计算具有基准年和相对百分比变化的指数

如何阅读/改进 PHP 计算的 C.R.A.P 指数

如何在 Java 中格式化包含指数的复杂公式

景观格局指数计算方法及代表的生态学意义(待补充)

python中如何计算百分数

如何将最大宽度设置为百分比和像素?