当前位置: 首页 > 知识库问答 >
问题:

java带供款的复利公式

江永安
2023-03-14

我目前正在尝试开发一个复利计算器,其中包括每月供款。我已经成功地使用以下代码在没有每月供款的情况下计算复利,但无法计算出添加每月供款时的公式。

double calculatedValue = (principalValue * Math.pow(1 + (interestRateValue/numberOfCompoundsValue), (termValue * numberOfCompoundsValue)));

当试图通过贡献获得计算值时,我改变了这样做的方式。请参阅下面的代码,了解我是如何实现这一点的。

//The starting principal
double principalValue = 5000;

//Interest rate (%)
double interestRateValue = 0.05;

//How many times a year to add interest
int numberOfCompoundsValue = 4;

//The number of years used for the calculation
double termValue = 30;

//The monthly contribution amount
double monthlyContributionsValue = 400;

//How often interest is added. E.g. Every 3 months if adding interest 4 times in a year
int interestAddedEveryXMonths = 12/numberOfCompoundsValue;

//The total number of months for the calculation
int totalNumberOfMonths = (int)(12 * termValue);

    for(int i = 1; i <= totalNumberOfMonths; i++)
    {

        principalValue += monthlyContributionsValue;

        if(i % interestAddedEveryXMonths == 0)
        {
            principalValue += (principalValue * interestRateValue);
        }
    }

我想这应该符合我的要求。每月将本金增加供款金额,如果该月等于应加利息的月份,则计算利息*利率,并将其加至本金。

当使用上面的值时,我期望得到355242.18美元的答案,但得到10511941.97美元,这在我的银行账户中看起来更好,但在我的计算中没有。

如果有人能给我一些帮助或指出我哪里出了错,我将不胜感激。

提前谢谢

共有3个答案

燕英奕
2023-03-14
static void Main(string[] args)
        {
            double monthlyDeposit;
            double rateOfInterest;
            double numberOfCompounds;
            double years;
            double futureValue = 0;
            double totalAmount = 0;
Console.WriteLine("Compound Interest Calculation based on monthly deposits");
            Console.WriteLine("Monthly Deposit");
            monthlyDeposit = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Rate Of Interest");
            rateOfInterest = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Number of Compounds in a year");
            numberOfCompounds = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Number of year");
            years = Convert.ToDouble(Console.ReadLine());
            futureValue = monthlyDeposit;
            for (int i = 1; i <= years * 12; i++)
            {
                totalAmount = futureValue * (1 + (rateOfInterest / 100) / 12);
                if (i == years * 12)
                    futureValue = totalAmount;
                else
                    futureValue = totalAmount + monthlyDeposit;
            }
            Console.WriteLine("Future Value is=" + futureValue);
            Console.ReadLine();

        }

        //Output
        Compound Interest Calculation based on monthly Deposits
        Monthly Deposit
        1500
        Rate Of Interest
        7.5
        Number of Compounds in a year
        12
        Number of year
        1
        Future Value is=18748.2726237313
司空元凯
2023-03-14

经过一些简短的测试,我得出结论,您可以:

>

错误地问了你的问题

您所描述的您想要的计算(5000美元开始,每月400美元,30年利息,每3个月)由您提供的代码找到。它给出的值($10,511,941.97)在我看来确实是正确的。我能提供的唯一其他建议是,如果您需要(例如termValue可以是int),并且当您知道值不会改变时(例如interest stRateValue)使用最终。这将有助于避免更大程序中的任何不可预见的错误。我希望这能帮助你找出你的兴趣计算器或回答你的任何问题。

乐正宏深
2023-03-14

您的问题在于:

principalValue += (principalValue * interestRateValue);

你每季度加一整年的利息,而你应该只加一个季度的利息。你需要降低利率以获得合适的利率。

下面是一个示例:

class CashFlow {
    private final double initialDeposit;
    private final double rate;
    private final int years;
    private final double monthlyContribution;
    private final int interestFrequency;

    CashFlow(double initialDeposit, double rate, int years,
             double monthlyContribution, int interestFrequency) {
        if ( years < 1 ) {
            throw new IllegalArgumentException("years must be at least 1");
        }

        if ( rate <= 0 ) {
            throw new IllegalArgumentException("rate must be positive");
        }

        if ( 12 % interestFrequency != 0 ) {
            throw new IllegalArgumentException("frequency must divide 12");
        }

        this.initialDeposit = initialDeposit;
        this.rate = rate;
        this.years = years;
        this.monthlyContribution = monthlyContribution;
        this.interestFrequency = interestFrequency;
    }

    public double terminalValue() {
        final int interestPeriod = 12 / interestFrequency;
        final double pRate = Math.pow(1 + rate, 1.0 / interestPeriod) - 1;
        double value = initialDeposit;

        for ( int i = 0; i < years * 12; ++i ) {
            value += monthlyContribution;

            if ( i % interestFrequency == interestFrequency - 1 ) {
                value *= 1 + pRate;
            }  
        }

        return value;
    }
}

class CompoundCalc {

    public static void main(String[] args) {
        CashFlow cf = new CashFlow(5000, 0.05, 30, 400, 3);
        System.out.println("Terminal value: " + cf.terminalValue());
    }
}

带输出:

run:
Terminal value: 350421.2302849443
BUILD SUCCESSFUL (total time: 0 seconds)

这接近你找到的35.5万美元的价值。

您可以使用许多不同的约定来获取季度费率。将年利率除以4是一个简单而实用的方法,但上面的pow(1利率,1/4)-1方法在理论上更可靠,因为它在数学上与相应的年利率相等。

 类似资料:
  • 以下两者之间的区别是什么:

  • 问题内容: 假设您正在为BarBaz Incorporated开发项目的核心模块。您的代码片段可能如下所示: 如果您的公司网站不是,而是惯例,那会是什么样的惯例? 问题答案: SUN时代的Java语言规范给出了建议的约定: 如果域名包含连字符或标识符中不允许的任何其他特殊字符(第3.8节),请将其转换为下划线。 但这只是一个建议…

  • 所以我要做的任务是找出一个委托人达到某个值所需的年数。比如说,我从5000美元开始,我想以10%的年利率积累15000美元。我想知道这项投资的持续时间有多长 这就是我到目前为止所做的 输出: 如何只打印最后一行?

  • 有没有办法在Java8中构建一个使用索引迭代的方法?理想情况下,我想要这样的东西: 我现在能做的就是:

  • 该简介旨在创建一个ID为1122、余额为20000英镑、年利率为4.5%、取款方式为2500英镑、存款方式为3000英镑、打印余额、月利率和账户创建日期的账户对象。 我写了下面的代码,但主要方法是初始余额错误应该是20000英镑,而不是20500英镑,提款和存款也错误。金额应该是提款=17,500英镑,存款=20,500英镑。关于如何重新爱这个有什么建议吗?

  • 本文向大家介绍bluepy 一款python封装的BLE利器简单介绍,包括了bluepy 一款python封装的BLE利器简单介绍的使用技巧和注意事项,需要的朋友参考一下 1、bluepy 简介 bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口。 This is a project to provide an A