好的,这个问题将不得不用一些伪代码可视化,所以我们开始:
假设我有 2 个整数,一个是变量,另一个是常量。
这样说:
int current = 0; static int max = 20
考虑到这一点,我怎么加得更慢,越接近 20,所以基本上它永远不会真正达到 20。 下面是一个示例:
假设添加 2 需要 3 秒 但是在前一个 2 之后添加相同的 2 需要两倍的时间,依此类推。
我会怎么做,对不起,如果很难理解,但我尽力了:(
谢谢,祝你有美好的一天!
一个可以玩的例子。
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 中 Numbers 的精度有限,这段代码最终会到达终点。
您可以使用公式
A = Pert
其中A
是结果金额;P
是启动校长;e
是数学无理常数e
,自然对数的底数,通常称为欧拉数,大约2.718281828459045
;r
利率是小数;t
是以年为单位的时间,通常除以360
。
假设起始本金为0
,结果将是0
,因为没有利息可以产生0
的本金。我们可以从.01
的名义值开始,然后将新本金设置为应计利息添加到先前本金的结果。
javascript
可以使用do..while
循环来生成新的主体,在这里,我们以起始速率的一半停止循环,或者.05/2
do..while
循环中创建一个立即调用函数表达式来传递当前主体,推送一个在current
或current * duration
后返回Promise
的函数, 其中duration
是正整数,利用Array.prototype.reduce()
调用函数,该函数按顺序返回Promise
,将下一个setTimeout
的持续时间增加current
或current * duration
。
您还可以将公式调整为Math.exp(r * (t/n))
或
A = Per(t/n)
例如,n
可以是360
,以.05
的利率从本金1
连续复利,执行do..while
循环360
次,一个财政年度;这将在1
之间产生更多的总结果,即1
以5%
的比率连续复利1年,其中最大可能的结果将是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}`;
});
<output></output>