越来越接近它获得最大分配值

时间:2017-02-12 01:22:06

标签: javascript math

好的,这个问题必须用一些伪代码可视化,所以我们走了:

假设我有2个整数,一个是变量,另一个是常数。

这样说:

int current = 0; static int max = 20

考虑到这一点,我将如何添加更慢,越接近20,所以基本上它实际上从未达到20。 这是一个例子:

假设添加2需要3秒 但是加上相同的2,之前的2需要两倍,依此类推。

我怎么会这样做,对不起,如果它很难理解,但我尽我所能:(

谢谢,祝你有个美好的一天!

2 个答案:

答案 0 :(得分:0)

一个可以玩的例子。

function progressiveInterpolatorThatNeverReachesTheEnd(rate, speed){
  speed = +speed || 1;
  var start = Date.now();
  
  return function(a, b){
    var time = (Date.now() - start);
    var t = Math.pow(1-rate, time * speed/1000);
	
    return a*t + b*(1-t);
  }
}

var start = Date.now();
var interpolate = progressiveInterpolatorThatNeverReachesTheEnd(1/16, 1/10);

var output = document.getElementById("output");

function update(){
  var a = 0, b = 100, c = interpolate(a, b);
  output.innerHTML = a + " .. " + Math.floor(c) + " .. " + b + "<br> actually: " + c + "<br>runtime: " + (Date.now() - start)/1000 + "s";

  requestAnimationFrame(update);
  //or
  //setTimeout(update, Math.random() * 500); 
  //because update interval doesn't matter
}
update();
<div id="output"></div>

实际上,由于JS中数字的精确度有限,这段代码最终会到达终点。

答案 1 :(得分:0)

您可以使用公式

A = Pe rt

其中A为结果金额; P是首席校长; e是数学无理常数e,是自然对数的基数,通常称为欧拉数,约为2.718281828459045; r是十进制的利率; t是以年为单位的时间,通常除以360

给定0的起始主体,结果将是0,因为没有兴趣可以累积0的主体。我们可以从.01的名义价值开始,然后将新的本金设置为添加到前一个本金的应计利息的结果。

javascript中,do..while循环可用于生成新主体,此处,我们以启动速率的一半停止循环,或.05/2循环do..while循环创建一个立即调用函数表达式来传递当前主体,推送一个在Promisecurrent之后返回current * duration的函数,其中duration是一个正整数,利用{{1调用按顺序返回Array.prototype.reduce()的函数,将Promise的持续时间增加setTimeoutcurrent

您还可以将公式调整为current * duration

A = Pe r(t / n)

其中Math.exp(r * (t/n))可以是n,以360的速率从主体1连续复合兴趣,执行.05循环{{ 1}}次,一个会计年度;这会在do..while之间产生更多的总结果,即3601的速度连续复合1年,最大可能结果为1,总计5%应计利息为1.0512710963760241

.0512710963760241传递给1函数会返回compound

1.0512710963760241
var current = 0; // principal
var max = 20; // maturity, in years
var rate = .05; // annual rate as decimal
var time = 1; // time in years, alternatively `1/360`
var N = 360; // fiscal year
var arr = []; // store functions which return a `Promise`
var duration = 500;
var output = document.querySelector("output");

function compound(p, r, t) {  
  return ((p||.01) * Math.exp(r * t)); // or `Math.exp(r * (t/N))` 
}

do {
  current = compound(current, rate, time);
   (function(curr) {
    arr.push(
      function() {
        return new Promise(function(resolve) {
          setTimeout(function() {
            output.innerHTML += `current principal: ${curr}<br>`;
            resolve();
          }, curr * duration)
        })
      }
    )
   })(current)
} while (current < max - (rate / 2));

arr.reduce(function(promise, next) {
  return promise.then(next)
}, Promise.resolve())
.then(function() {
   output.innerHTML += `<br>max - current: ${max - current}`; 
});