For循环内部与循环外

时间:2017-12-26 18:25:27

标签: javascript node.js

我试图在任意一年的经济衰退中进行复利计算。以下promise函数计算变量投资组合的开发。

澄清的编辑:

  • const recessions是一个将recyear从1到20循环的数组(recseverity是静态的)
  • 三元(thisyear == recyear)每次运行会在不同年份触发,导致portfolio在不同年份减少50%

const chunk = ( horizon, principal, roi, recyear, recseverity ) => { 
	return new Promise( resolve => {
		// Decimalise and create portfolio holder
		let portfolio = principal
		let crash = 1 - ( recseverity / 100 )
		let grow = 1 + ( roi / 100 )

		// Loop over the years and crash or grow
		for (let thisyear = 1; thisyear < horizon +1; thisyear++) {
			thisyear == recyear ? ( portfolio *= crash ) : ( portfolio *= grow )
			console.log( portfolio )
		}
		console.log( 'last', portfolio )

		// Resolve with the outcome
		resolve( { year: recyear, result: portfolio } )
	} )
}

const horizon = 20
const principal = 100
const roi = 7
const recseverity = 50
const yearlyadd = principal/horizon

const recessions = []
for (let year = 1; year < horizon +1; year++) {
	recessions.push( { year: year, severity: recseverity } )
}

Promise.all( recessions.map( recession => chunk( horizon, principal, roi, recession.year, recession.severity ) ) )
.then( console.log.bind( console ) )

除了投资组合变量的最终结果是一个对我没有意义的价值之外,一切都很完美。所有他们返回180.82637675169082。

我可以在console.log语句中看到for循环完美地工作直到循环的最后一次运行,它突然决定180.82637675169082就是答案。这是不可能的。

以上输出:

[ { year: 1, result: 180.82637675169082 },
  { year: 2, result: 180.82637675169082 },
  { year: 3, result: 180.82637675169082 },
  { year: 4, result: 180.82637675169082 },
  { year: 5, result: 180.82637675169082 },
  { year: 6, result: 180.82637675169082 },
  { year: 7, result: 180.82637675169082 },
  { year: 8, result: 180.82637675169082 },
  { year: 9, result: 180.82637675169082 },
  { year: 10, result: 180.82637675169082 },
  { year: 11, result: 180.82637675169082 },
  { year: 12, result: 180.82637675169082 },
  { year: 13, result: 180.82637675169082 },
  { year: 14, result: 180.82637675169082 },
  { year: 15, result: 180.82637675169082 },
  { year: 16, result: 180.82637675169082 },
  { year: 17, result: 180.82637675169082 },
  { year: 18, result: 180.82637675169082 },
  { year: 19, result: 180.82637675169082 },
  { year: 20, result: 180.82637675169082 } ]

查看console.log语句,看起来循环的最后一次运行是破坏事情的。组合变量在最后一次运行之前发展良好,然后它变成180.82637675169082。

2 个答案:

答案 0 :(得分:1)

我的假设是错误的。

我认为在复利计算中,投资组合减半的年份很重要。

用现实世界的术语来说:我认为如果你投资X金额,那么明年或10年后是否会出现衰退就很重要。

事实证明它没有。

PBKAC。

非常感谢那些帮助我得出这个结论的人。

答案 1 :(得分:0)

如果您分析代码,您会发现每次都进行相同的计算,结果会相同,请查看代码的这一行

            thisyear == recyear ? ( portfolio *= crash ) : ( portfolio *= grow )

var thisyear 将等于 recyear ,只有一次投资组合将乘以崩溃,这只会发生一次&lt;&lt;否则投资组合将乘以增长&gt;&gt;

除了 recyear 之外,每个变量中的每个变量都是相同的 所以除了你改变其他变量之外什么都不会改变结果

所以最后我希望你注意到这个问题