zoukankan      html  css  js  c++  java
  • 房贷计算器代码

        本人经过两天的修改,做了进一步完善。各个方法功能逐步完善。但是鉴于自己水平有限,代码中错误还是比较多,代码冗余度还是偏高。欢迎大家提出意见,已供代码进一步完善。希望大家多多帮助。谢谢大家。2019年10月25日21点。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Drawing;
    using System.Reflection;
    using System.Net.NetworkInformation;

    namespace play
    {
    class Program
    {
    //短期利率与长期利率
    double lowRate = 0;
    double highRate = 0;

    //KeyValuePair<DateTime, >;
    DateTime dt1 = new DateTime(2015, 3, 1);
    DateTime dt2 = new DateTime(2015, 5, 11);
    DateTime dt3 = new DateTime(2015, 6, 28);
    DateTime dt4 = new DateTime(2015, 8, 26);
    //贷款金额
    static double totalMoney, balance;

    static string choice;
    static string newChoice;
    //期数
    int n;
    //月供
    double payMonth;
    double rate;
    double interest;
    /// <summary>
    /// 用来构建欢迎界面
    /// </summary>
    void Paint()
    {
    Console.WriteLine("***************************");
    Console.WriteLine("***************************");
    Console.WriteLine("***************************");
    Console.WriteLine("欢迎使用房贷计算器");
    Console.WriteLine("***************************");
    Console.WriteLine("***************************");
    Console.WriteLine("***************************");

    Console.WriteLine("请按任意键继续");
    Console.ReadKey();
    Console.Clear();
    }
    /// <summary>
    /// 按日期选择利率
    /// </summary>
    /// <param name="dt">输入的日期</param>
    void RateChoose(DateTime dt)
    {
    if (dt >= dt4)
    {
    lowRate = 0.0275;
    highRate = 0.0325;
    }
    else if (dt >= dt3)
    {
    lowRate = 0.03;
    highRate = 0.035;
    }
    else if (dt >= dt2)
    {
    lowRate = 0.0325;
    highRate = 0.0375;
    }
    else if (dt >= dt1)
    {
    lowRate = 0.035;
    highRate = 0.04;
    }
    else
    {
    Console.WriteLine("你输入的日期不在范围内");
    Console.ReadKey();
    Environment.Exit(0);
    }
    }
    /// <summary>
    /// 计算月供
    /// </summary>
    void Payment(DateTime dt)
    {
    //设置缓冲区高度,即设置显示的最大行数
    Console.BufferHeight = 1000;
    RateChoose(dt);
    switch (choice)
    {
    case "1":
    {
    //等额本息,月供计算方法
    for (n = 1; n <= 360; n++)
    {


    if (n <= 60)
    {
    rate = lowRate;
    }
    else
    {
    rate = highRate;
    }
    //计算月供
    double p;
    p = rate / 12;
    payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
    //利息
    interest = n * payMonth;
    if (n % 2 == 0)
    {
    Console.ForegroundColor = ConsoleColor.Blue;
    }
    else
    {
    Console.ForegroundColor = ConsoleColor.White;
    }
    Console.WriteLine("{0}期按揭贷款的月供是{1:0.00}元,总利息是{2:0.00}元", n, payMonth, interest);

    }
    }
    break;
    case "2":
    {
    //等额本金,月供计算方法
    for (n = 1; n <= 360; n++)
    {
    if (n <= 60)
    {
    rate = lowRate;
    }
    else
    {
    rate = highRate;
    }
    //计算月供
    double p;
    p = rate / 12;
    payMonth = (totalMoney / n) + totalMoney * p;
    interest = ((totalMoney / n + totalMoney * p) + totalMoney / n * (1 + p)) / 2 * n - totalMoney;
    Console.WriteLine("{0}期按揭贷款的首月还款额是{1:0.00}元,总利息是{2:0.00}元", n, payMonth, interest);
    }
    }
    break;
    }
    }

    /// <summary>
    /// 月贷计算方法
    /// </summary>
    /// <param name="n">还款期数</param>
    void Compute(int n)
    {
    Console.WriteLine("期次 偿还利息 偿还本金 还款额 剩余本金");
    switch (choice)
    {

    case "1":
    //等额本息法计算房贷
    {
    if (n <= 60)
    {
    rate = lowRate;
    }
    else
    {
    rate = highRate;
    }

    double p;
    p = rate / 12;
    payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
    for (int i = 1; i <= n; i++)
    {
    //string s = i.ToString();
    interest = totalMoney * p;
    double capital = payMonth - interest;
    totalMoney -= capital;
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", i, interest, capital, payMonth, totalMoney);
    }
    }
    break;
    case "2":
    //等额本金法计算房贷
    {
    if (n <= 60)
    {
    rate = lowRate;
    }
    else
    {
    rate = highRate;
    }
    double p;
    p = rate / 12;
    double capital = totalMoney / n;
    for (int i = 1; i <= n; i++)
    {

    interest = totalMoney * p;
    payMonth = capital + interest;
    totalMoney -= capital;

    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", i, interest, capital, payMonth, totalMoney);
    }
    }
    break;

    }
    }
    /// <summary>
    /// 计算还款状况
    /// </summary>
    /// <param name="n0">还款期数</param>
    /// <param name="dt">首次还款时间</param>
    void Repayment(int n0, DateTime dt)
    {
    balance = totalMoney;
    DateTime dt0 = dt;
    double rate0;
    double capital;
    double p;
    Console.WriteLine("还款时间 偿还利息 偿还本金 还款额 剩余本金");
    switch (choice)
    {
    case "1":
    {

    RateChoose(dt0);
    if (n0 <= 60)
    {
    rate0 = lowRate;
    }
    else
    {
    rate0 = highRate;
    }
    n = n0;
    for (int i = 1; i <=n0; i++)
    {
    RateChoose(dt);
    rate = (n0 <= 60 ? lowRate : highRate);

    if (dt.Year != dt0.Year && rate != rate0)//这里应该有问题?
    {
    double p0 = rate0 / 12;
    double payMonth0= (p0 * totalMoney * Math.Pow((1 + p0), n)) / ((Math.Pow(1 + p0, n) - 1));
    double interest0 = balance * p0;
    double capital0 = payMonth0 - interest0;

    rate0 = rate;

    interest = balance * (rate0/12);
    totalMoney = balance;
    balance -= capital0;

    payMonth = capital0 + interest;
    n =n0 - i+1;
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", dt, interest, capital0, payMonth, balance);
    dt = dt.AddMonths(1);
    continue;
    }



    p = rate0 / 12;
    payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));

    interest = balance * p;
    capital = payMonth - interest;
    balance -= capital;
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", dt, interest, capital, payMonth, balance);
    dt = dt.AddMonths(1);

    }

    }
    break;
    case "2":
    {
    RateChoose(dt0);
    rate0 = (n0 <= 60 ? lowRate : highRate);
    n = n0;
    for (int i = 0; i < n0; i++)
    {
    RateChoose(dt);
    rate = (n0 <= 60 ? lowRate : highRate);
    if (dt.Year!=dt0.Year&&rate!=rate0)
    {
    rate0 = rate;
    }
    p = rate0 / 12;
    capital = totalMoney / n0;
    interest = balance * p;
    payMonth = capital + interest;
    balance -= capital;
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", dt, interest, capital, payMonth, balance);
    dt = dt.AddMonths(1);
    }
    }
    break;
    }
    }
    /// <summary>
    ///实现提前还款功能
    /// </summary>
    /// <param name="n">还款总期数</param>
    /// <param name="dt1">首次还款时间</param>
    /// <param name="dt2">提前还款时间</param>
    void Prepayment(int n0,DateTime dt1,DateTime dt2,double money)
    {
    balance = totalMoney;
    DateTime dt0 = dt1;
    double rate0;
    double capital;
    double p;
    bool flag = false;
    Console.WriteLine("还款时间 偿还利息 偿还本金 还款额 剩余本金");
    switch (choice)
    {
    case "1":
    {
    RateChoose(dt0);
    rate0 = (n0 <= 60 ? lowRate : highRate);
    n = n0;
    for(int i=1;i<=n0;i++)
    {
    RateChoose(dt1);
    rate = (n0 <= 60 ? lowRate : highRate);

    if (dt1.Year != dt0.Year && rate != rate0)//这里应该有问题?
    {
    double p0 = rate0 / 12;
    double payMonth0 = (p0 * totalMoney * Math.Pow((1 + p0), n)) / ((Math.Pow(1 + p0, n) - 1));
    double interest0 = balance * p0;
    double capital0 = payMonth0 - interest0;

    rate0 = rate;

    interest = balance * (rate0 / 12);
    totalMoney = balance;
    balance -= capital0;

    payMonth = capital0 + interest;
    n = n0 - i + 1;
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", dt1, interest, capital0, payMonth, balance);
    dt1 = dt1.AddMonths(1);
    continue;
    }

    p = rate0 / 12;
    if (dt2.Year == dt1.Year && dt2.Month == dt1.Month)
    {
    balance -= money;
    totalMoney = balance;
    switch (newChoice)
    {
    case "1":
    {

    n = n0 - i + 1;
    flag = true;
    }
    break;
    case "2":
    {
    double temp = Math.Log((payMonth / (payMonth - totalMoney * p)), (1 + p));
    n= (int)Math.Ceiling(temp);
    n0 = n + i - 1;
    }
    break;
    }

    }
    payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));

    interest = balance * p;
    capital = payMonth - interest;
    balance -= capital;
    if (flag)
    {
    payMonth += money;
    capital += money;
    flag = false;
    }
    Console.WriteLine("{0} {1:0.00} {2:0.00} {3:0.00} {4:0.00}", dt1, interest, capital, payMonth, balance);
    dt1 = dt1.AddMonths(1);
    }
    }
    break;
    case "2":
    {

    }
    break;
    }
    }
    static void Main(string[] args)
    {

    {
    Program p = new Program();
    p.Paint();
    Console.WriteLine("请选择您的操作!1.房贷计算 2.月供速算 3.还款状况 4.提前还款");
    Console.WriteLine("请选择您的还款方式?1.等额本息 2.等额本金");
    choice = Console.ReadLine();
    Console.WriteLine("请输入你的贷款金额");
    totalMoney = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("请输入您贷款的期数");
    int number = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("请输入你的首次贷款时间");
    DateTime dT = Convert.ToDateTime(Console.ReadLine());
    Console.WriteLine("请输入你的提前还款时间");
    DateTime dTR = Convert.ToDateTime(Console.ReadLine());
    Console.WriteLine("请输入你的还款金额");
    double partMoney = Convert.ToDouble(Console.ReadLine());
    Console.WriteLine("请选择你要的后续操作!1.减少月供 2.缩短年限");
    newChoice = Console.ReadLine();
    //Console.WriteLine("你输入的日期是{0},短期利率是{1},长期利率是{2}",dT,p.lowRate,p.highRate);
    //dT= dT.AddMonths(1);
    // Console.WriteLine(dT);
    // p.Repayment(number, dT);
    // p.Compute(number);
    // p.Payment(dTR);
    p.Prepayment(number, dT, dTR, partMoney);
    Console.ReadKey();
    }
    }
    }
    }

  • 相关阅读:
    面向对象的三个基本特征(讲解)
    GridView 72般绝技
    Asp.net 将数据库里的记录转换成json
    jquery json asp.net 将各种对象:list ..等转换成
    sql2000 分页存储过程
    .NET中DataSet转化Json工具类
    从攻击者痕迹看内网常见命令
    从攻击者角度看SetMpreference小结
    Java NIO 实现服务端和客户端的通信示例
    spark streaming 监听器执行顺序
  • 原文地址:https://www.cnblogs.com/xiaochen0409/p/11727462.html
Copyright © 2011-2022 走看看