使用 js 实现 贷款计算器功能

2023-11-14

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table>
        <tr>
            <th>Enter Loan Data:</th>
            <td></td>
            <th>Loan Balance, Interest Payments</th>
        </tr>
        <tr>
            <td>Amount of Loan ($):</td>
            <td><input id="amount" onchange="calculate()"/></td>
            <td rowspan=8>
                <canvas id='graph' width=400 height=250></canvas>
            </td>
        </tr>
        <tr>
            <td>
                Annual interest(%):
            </td>
            <td><input id='apr' onchange="calculate()"/></td>
        </tr>
        <tr>
            <td>
                Repayments period(years):
            </td>
            <td><input id='years' onchange="calculate()"/></td>
        </tr>
        <!-- <tr>
            <td>
                Zipcode (to find lenders):
            </td>
            <td><input id='zipcode' onchange="calculate()"/></td>
        </tr> -->
        <tr>
            <td>
                Approximate payments:
            </td>
            <td><button onclick="calculate()">Calculate</button></td>
        </tr>
        <tr>
            <td>
                Monthly payment:
            </td>
            <td>$<span id="payment"></span></td>
        </tr>
        <tr>
            <td>
                Total payment:
            </td>
            <td>$<span id="total"></span></td>
        </tr>
        <tr>
            <td>
                Total interest:
            </td>
            <td>$<span id="totalinterest"></span></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <th>
                Sponsors:
            </th>
            <td colspan=2>Apply for your loan with one of these fine lenders:
            <div id="lenders"></div>
            </td>
        </tr>
    </table>

    <script>
        function calculate(){
            // 贷款金额         
            var amount = document.getElementById('amount');
            // 年利息
            var apr = document.getElementById('apr');
            // 偿还周期
            var years = document.getElementById('years');
            //var zipcode = document.getElementById('zipcode');
            // 每月支付
            var payment = document.getElementById('payment');
            // 总支付
            var total = document.getElementById('total');
            // 总利息
            var totalinterest = document.getElementById('totalinterest');

            // amount 贷款总额
            var principle = parseFloat(amount.value);
            // apr 年利率
            var interest = parseFloat(apr.value) /100 /12;
            // 偿还周期 月份
            var payments = parseFloat(years.value) * 12;
            // pow 求次幂
            var x = Math.pow(1 + interest, payments);
            // monthly 每月还款金额
            var monthly = (principle * x * interest) / (x-1);

            if(isFinite(monthly)){
                payment.innerHTML = monthly.toFixed(2);
                total.innerHTML = (monthly * payments).toFixed(2);
                totalinterest.innerHTML = (monthly * payments - principle).toFixed(2);

                // 保存数据到本地
                // save(amount.value, apr.value, years.value, zipcode.value);
                save(amount.value, apr.value, years.value, '');
                // 借贷人省略

                // 画图
                chart(principle, interest, monthly, payments);
            }else{ 
                payment.innerHTML = "";
                total.innerHTML = "";
                totalinterest.innerHTML = "";
                chart();
            }
        }

        function save(amount, apr, years, zipcode){
            if(window.localStorage){
                localStorage.loan_amount = amount;
                localStorage.loan_apr = apr;
                localStorage.loan_years = years;
                localStorage.loan_zipcode = zipcode;
            }
        }

        window.onload = function(){
            if(window.localStorage && localStorage.loan_amount){
                document.getElementById('amount').value = localStorage.loan_amount;
                document.getElementById('apr').value = localStorage.loan_apr;
                document.getElementById('years').value = localStorage.loan_years;
                //document.getElementById('zipcode').value = localStorage.loan_zipcode;
            }
        }

        function chart(principle, interest, monthly, payments){
            var graph = document.getElementById('graph');
            graph.width = graph.width;

            if(!graph.getContext) return;

            var g = graph.getContext('2d');

            var width = graph.width;
            var height = graph.height;

            // 画总利息
            function paymentToX(n){
                return n * width / payments;
            }
            function amountToY(a){
                return  height - a * height / (monthly * payments * 1.05);
            }
            g.moveTo(paymentToX(0), amountToY(0));
            g.lineTo(paymentToX(payments), amountToY(monthly * payments));
            g.lineTo(paymentToX(payments), amountToY(0));
            g.closePath();
            g.fillStyle = '#f88';
            g.fill();
            g.font = "bold 12px '微软雅黑'";
            //g.fillStyle = "yellow";
            g.fillText("Total interest payments", 20, 20);          

            // 画净值
            var equity = 0;
            g.beginPath();
            g.moveTo(paymentToX(0), amountToY(0));

            for( var p = 1; p<=payments; p++){
                var thisMonthsInterest = (principle - equity) * interest;
                equity += (monthly - thisMonthsInterest);
                g.lineTo(paymentToX(p), amountToY(equity));
            }   

            g.lineTo(paymentToX(payments), amountToY(0));
            g.fillStyle = 'green';
            g.fill();
            g.fillText('Total Equity', 20, 35);

            //画余额
            var bal = principle;
            g.beginPath();
            g.moveTo(paymentToX(0), amountToY(bal));
            for(var p=1; p<payments;p++){
                var thisMonthsInterest = bal*interest;
                bal-= (monthly - thisMonthsInterest);
                g.lineTo(paymentToX(p), amountToY(bal));
            }
            g.lineWidth = 3;
            g.fillStyle='black';
            g.stroke();
            g.fillText("Loan Balance", 20, 50);

            //将年度数据在X轴做标记
            g.textAlign = 'center';
            var y = amountToY(0);
            for(var year=1; year*12<=payments;year++){
                var x = paymentToX(year*12);
                g.fillRect(x-0.5, y-3, 1, 3);
                if(year ==1){
                    g.fillText("Year",x,y-5);
                }
                if(year % 5==0 && year*12 !== payments){
                    g.fillText(String(year),x,y-5);
                }
            }
            //将赔付数额标记在右边界
            g.textAlign = "right";
            g.textBaseline = "middle";
            var ticks = [monthly*payments, principle];
            var rightEdge = paymentToX(payments);
            for(var i=0;i<ticks.length;i++){
                var y = amountToY(ticks[i]);
                g.fillRect(rightEdge -3, y-0.5,3,1);
                g.fillText(String(ticks[i].toFixed(0)), rightEdge-5, y);
            }

        }





    </script>   
</body>
</html>

示例图片如下:
这里写图片描述

源码下载地址:js 贷款计算器源码下载地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 js 实现 贷款计算器功能 的相关文章

随机推荐

  • 通过“hay的素质理论“,分析个人的学习能力

    1 学习能力是什么 大家觉得 学习能力不就是看书更快 更好的理解记忆 考试拿高分的能力吗 到了职场 还固步自封在应试教育阶段 就有点呵呵了 虽然面试官也会问 最近有看什么书啊 能给我们讲讲里面内容吗 但面试官绝对不只是想了解 你是不是爱看书
  • webgl学习之路(三)——透视投影矩阵的推导过程

    关于透视投影矩阵的讲解 网上有不少教程 但是有一点大家基本上都没有讲清楚 就是z轴坐标 这里的Z轴相当于景深 的推导过程 基本上是一笔带过 下面先从头开始讲推导过程 再慢慢说Z轴的推导过程 透视投影如下图 透视投影的过程如下 所观察的物体在
  • 前端实现拖拽效果改变元素顺序

    文章目录 前言 一 实现效果 二 拖拽API 1 代码 2 遇见问题 总结 前言 在一次工作中 前端要实现通过鼠标实现拖拽改变顺序的功能 之前没有接触过拖拽这一块所以刚开始一筹莫展 幸运的是在查阅学习中实现了前端拖拽功能 一 实现效果 二
  • python对离散功率点进行积分得到电耗

    data pd read csv r C Users EDY Desktop csv data from scipy integrate import trapz scipy integrate trapz y x scipy integr
  • PCL 将对象模板与点云对齐

    目录 一 算法概述 二 代码实现 三 结果展示 四 相关链接 五 实验数据 一 算法概述 这是PCL官网给出的一个模版匹配教程 用来说明如何将其他教程中介绍的一些工具结合起来解决一个更高层次的问题 即将以前捕获的对象模型与一些新捕获的数据对
  • 红黑树(算法导论版)

    1 定义 1 每个节点是红色或者黑色的 2 根节点是黑色的 3 所有叶子结点 NIL 都是黑色的 4 如果一个节点是红色 则它的两个子节点都是黑色的 5 对每个节点 从该节点到其所有后代叶节点的简单路径上 均包含相同数目的黑色节点 2 性质
  • 飞行汽车比无人驾驶更早到来?清华猛狮团队研制出陆空两栖自主驾驶飞车

    清华猛狮无人驾驶实验室一年前启动无人驾驶飞车研制项目 一年时间内 第一代研发样机已在河北清华发展研究院固安分院与延庆山区试飞成功 了解无人车挑战赛的人 对清华猛狮无人智能车团队并不陌生 它是由清华大学车辆与运载学院和清华大学计算科学与技术系
  • Yarn介绍及快速安装 - Debian/Ubuntu Linux

    1 Yarn介绍 Yarn 是一个用于管理 JavaScript 包的快速 可靠和安全的包管理器 它是由 Facebook Google Exponent 和 Tilde 团队共同开发的 旨在提供比 npm 更快速 可靠的包管理体验 以下是
  • IBM小型机(AIX)技术手册(一)

    2007年7月 2008年7月在北京中软国际的工作时总结的IBM小型机技术手册 AIX基本命令 创建文件夹 Mkdir 名称 查看硬件信息 prtconf 查看卷组 lsvg o 查看进程 ps ef grep 名称 如 socket等 查
  • python模拟鼠标拖动滑块_Python+Selenium 拖动滑块 (一)

    在我们登录账号中常常会遇到各种验证码 如图片验证码 拖动滑块验证 滑块验证码只需要用户使用鼠标将滑块从某个位置拖动到另一个位置即可 程序通过记录用户拖动滑块的轨迹 这一串的轨迹数据采用模式识别的手段就可以判断出这是否是真人在操作 滑块验证通
  • 中标麒麟 docker安装及运行第一个实例

    一 下载安装包 选择适合版本 本次安装选择20 10 7 Index of linux static stable x86 64 二 安装 1 将下载的安装文件进行解压 命令如下 tar xzf docker 20 10 7 tar 2 将
  • 【Linux内核】cpu时间片的概念

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 cpu时间片的概念 时间片即CPU分配给各个程序的时间 每个线程被分配一个时间段 称作它的时间
  • 【mcuclub】PTC加热模块

    一 实物图 名称 PTC加热片 工作电压 5V 最大温度 180 功率 7 12W 是否防水 不防水 外部加热 名称 加热棒 工作电压 5V 最大温度 110 功率 7 10W 是否防水 防水 可直接放入水中 二 简介 PTC电加热器是一种
  • Linux命令自动补齐oh-my-zsh插件及美化主题超详细

    安装zsh 1 查看系统当前使用的shell echo SHELL 2 查看系统是否安装了zsh cat etc shells 3 用yum安装zsh yum y install zsh 4 查看shell列表 cat etc shells
  • [附源码]计算机毕业设计Python游戏交易平台(程序+源码+LW文档)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行 环境配置 Pychram社区版 python3 7 7 Mysql5 7 HBuilderX list pip Navicat11 Django nodejs 项目技
  • C#中Socket的Accept()和BeginAccept()的区别

    C 中Socket的Accept 和BeginAccept 的区别 区别在于 Accept 是同步的 BeginAccept 是异步的 调用accept 或者BeginAccept 函数来接受客户端的连接 这就可以和客户端通信了 Begin
  • 五分钟学会一门编程语言?

    大家好 我是可乐 看到标题 不出意外的话 你肯定开始骂我了 标题党 什么编程语言五分钟就能学会 其实我本来也是不相信的 但是学过了才知道这是真的 1 Brainfuck 看到这个小标题 不要误会 我没有骂人 这就是今天文章的主人公 也就是让
  • 如何理解BIO、NIO、AIO的区别

    一 同步阻塞I O BIO 同步阻塞I O 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器就需要启动一个线程进行处理 如果这个连接不做任何事情会造成不必要的线程开销 可以通过线程池机制来改善 BIO方式适用于连接数目比较小且固
  • Leetcode 124. 二叉树中的最大路径和

    题目内容 给定一个非空二叉树 返回其最大路径和 本题中 路径被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 该路径至少包含一个节点 且不一定经过根节点 示例 1 输入 1 2 3 1 2 3 输出 6 示例 2 输
  • 使用 js 实现 贷款计算器功能

    table tr th Enter Loan Data th td td th Loan Balance Interest Payments th tr tr td Amount of Loan td tr table