Javscript-通货膨胀/升级超过X年

时间:2018-12-10 16:44:47

标签: javascript

我一直在构建JS计算器以帮助支付年费,但我一直在努力争取一部分。

有一个字段应该显示年费总额,在Y年中每年以X%的速度递增。

有点难以解释,因此下面是一个示例:

人员A的工资为£24,000 ,每年递增 3.5%。我们需要找出在 7.373 年内支付给A人的总额。

如果我在FOR循环中执行此操作,则如果年份只是整数,则可以很好地工作,但是我需要浮点运算的解决方案,而且我不确定如何实现这一点-我们需要找出7.373年的总数而不仅仅是7个(仅举一个例子,它可以是任意年数)。

以下是使用整数可以正常工作的测试代码:

year = 7;
money = 24000;
num = 0;
percent = 1 + (3.5 / 100);
for(y = 1; y <= year; y++) {
    num = num + 1;
    money = money * interest
    console.log('Year '+ num + ' - ' + money);
    // other stuff
}

结果输出如下:

1年级-24,840.00
2年-25,709.40
3年级-26,609.23
四年级-27,540.55
5年级-28,504.47
六年级-29,502.13
7年-30,534.70

我真正需要的是所有这些年的总和(即193,240.48),而不仅仅是计算7年,而是7.373年(或输入任何定义的浮动)。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您需要再计算一年。在此示例中,您需要8年。然后,您可以采用年份的百分比并将其添加到总和中。

在循环中,您可以使用Math.ceil(year)。这将使年份四舍五入,因此使用7.373年,您将获得8个循环。您可以对此进行测试,并相应地调整百分比:

let year = 7.373;
let money = 24000;
let num = 0;
let total = 0
let percent = 1 + (3.5 / 100);
for (let y = 1; y <= Math.ceil(year); y++) {
  num = num + 1;
  money = money * percent
  if (y > year) { // year 8
    // the sum will only increas .373 of year 8
    money *= 1 - (y - year)
    console.log(`Calculating ${1- (y-year)} of year ${y}`)
  }

  //  increment total
  total += money

  console.log('Year ' + num + ' - ' + money.toLocaleString('en-GB', {
    style: 'currency',
    currency: 'GBP'
  }));
  // other stuff
}
console.log(`Total: after ${year} years:`, total.toLocaleString('en-GB', {
  style: 'currency',
  currency: 'GBP'
}))

此外,因为这是一个不同的问题,所以在这里并没有真正解决这个问题,但是您需要注意金钱和浮动金额,因为舍入错误可能会导致问题。

答案 1 :(得分:0)

我建议创建一个由这些值组成的数组,然后将其总计为7年,然后将第8年添加为该年的.373分数。

const year = 8;
let money = 24000;
const percent = 1 + (3.5 / 100);
let arrayOfYears = []

for(y = 1; y <= year; y++) {
    money = money * interest
    arrayOfYears.push(money)
    console.log('Year '+ y + ' - ' + money);
    // other stuff
}

let sum = arrayOfYears.reduce((acc, cur, idx) => {
    if (idx < 7) {
        return acc + cur
    } else {
        return acc + (cur * 0.373)
    }
}, 0)

console.log(sum)

答案 2 :(得分:0)

您的问题的具体说明留下了一些解释,因此可能性不同。通常在一年后增加,即在全年结束时增加。同样,当您将整个百分比应用于一年时,小数年可以是第7年年底工资的一部分。另一种计算利息的方法可以是每天,但这并不是您的示例所显示的。请参见下面的示例。注意上面有关用浮点数到小数舍入等的讨论以及错误的介绍。在下面的代码中,可能需要在各个阶段固定到小数点后两位,以确保准确性,但希望您能理解。

        //Could round or make to fixed number of decimal places
        //the calculation maybe better to 2 decimal places i.e sprinkle with parseFloat(n.toFixed(2))
        function toDecStr(n) {
            return n.toLocaleString('en-GB',{minimumFractionDigits:2, maximumFractionDigits:2});
        }

        let targetYears = 7.373
        let startingSalary = 24000.00;
        let annualIncrease = 0.035; //3.5% increase, presumably at the end of each year
        let wholeYears = Math.trunc(targetYears);
        let fractionOfYear = targetYears - wholeYears; //Could round to a number of decimal places
        console.log("Whole years:%s + fraction of a year: %s",wholeYears,fractionOfYear);
        //calulate the whole number of years
        let totalSalary = startingSalary;
        let previousSalary = startingSalary
        console.log('Salary earned in year n and total salary to date:');
        console.log('Year %s = %s',1,toDecStr(startingSalary), toDecStr(totalSalary));
        for(let i = 2; i <= wholeYears; i++) {
            let newSalary = previousSalary * (1.0 + annualIncrease);
            totalSalary += newSalary; //At end of year i
            console.log('Year %s = %s %s', i, toDecStr(newSalary), toDecStr(totalSalary));
            previousSalary = newSalary;
        }
        // + Fractional year
        let earningsInPartialYear = previousSalary * fractionOfYear;
        totalSalary += earningsInPartialYear;
        console.log('Year %s %s', targetYears, toDecStr(earningsInPartialYear), toDecStr(totalSalary));
        //Note no salary increase in a fractional year (until the end the year)

礼物:

Whole years:7 + fraction of a year: 0.3730000000000002
Salary earned in year n and total salary to date:
Year 1 = 24,000.00 24,000.00
Year 2 = 24,840.00 48,840.00
Year 3 = 25,709.40 74,549.40
Year 4 = 26,609.23 101,158.63
Year 5 = 27,540.55 128,699.18
Year 6 = 28,504.47 157,203.65
Year 7 = 29,502.13 186,705.78
Year 7.373 11,004.29 197,710.07