JS,等额本息,等额本金计算器

目录

准备工作

 计算器代码:

css样式:(美观代码,无实际意义)

准备工作(2kb-3kb)

jqueryhttps://pan.baidu.com/s/1_fNhj5HLE4ekV9qmUlMpUQ

提取码:0602

 计算器代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--    换成自己的jquery地址,否则计算功能无法使用-->
    <script  type = "text/javascript" src="../static/jquery-3.6.0.js"></script>

    <meta charset="UTF-8">
    <title>理财计算器</title>
    <meta name="keywords" content="理财计算器">




</head>

<body>
<!--计算器开始-->
<div>
    <div>
        <div class="jsq_top">
            <div>出借利息计算器</div>
            <div>
                <div>
                    <aa>出借金额</aa><input type="text" id="total"><span>元</span><font></font>
                </div>
                <div>
                    <aa>出借利率</aa><input type="text" id="yearRate" errormsg="" placeholder="%">%
                </div>
                <div>
                    <aa>借款期限</aa>
                    <select name="select" id="sumTerm">
                        <option value="1">1个月</option>
                        <option value="3">3个月</option>
                        <option value="5">5个月</option>
                        <option value="10">10个月</option>
                        <option value="12">12个月</option>
                        <option value="24">24个月</option>
                        <option value="36">36个月</option>
                    </select>
                </div>
                <div>
                    <aa>还款方式</aa>
                    <select name="select" id="hkfs" >
                        <option value="MYFX" >先息后本</option>
                        <option value="DEBX" >等额本息</option>
                        <option value="DEBJ" >等额本金</option>
                        <option value="YCFQ" >一次付清</option>
                    </select>
                </div>
                <div>
                    <button class="jsqks">开始计算</button>
                </div>
            </div>
            <div id="showjs1" style="display:none;">
                <div><h4>收益描述</h4></div>
                <div class="jsq_xq">
                    <div>
                        <span>出借金额</span><font id="mtoal"></font>
                    </div>
                    <div>
                        <span>应收利息</span><font id="ghbx"></font>
                    </div>
                    <div>
                        <span>收回全部本息时间</span><font id="mthns"></font>
                    </div>
                    <div class="clr"></div>
                </div>
            </div>
            <div id="showjs2" style="display:none;">
                <div><h4>本息回收时间表</h4></div>
                <div>
                    <table border="0" cellpadding="0" cellspacing="0" class="jstr">
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

<!--计算器结束-->
<script type="text/javascript">
    Number.prototype.toFixed = function(d)
    {
        var s=this+"";if(!d)d=0;
        if(s.indexOf(".")==-1)s+=".";s+=new Array(d+1).join("0");
        if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0,"+ (d+1) +"})?)\\d*$").test(s))
        {
            var s="0"+ RegExp.$2, pm=RegExp.$1, a=RegExp.$3.length, b=true;
            if (a==d+2){a=s.match(/\d/g); if (parseInt(a[a.length-1])>4)
            {
                for(var i=a.length-2; i>=0; i--) {a[i] = parseInt(a[i])+1;
                    if(a[i]==10){a[i]=0; b=i!=1;} else break;}
            }
                s=a.join("").replace(new RegExp("(\\d+)(\\d{"+d+"})\\d$"),"$1.$2");
            }if(b)s=s.substr(1);return (pm+s).replace(/\.$/, "");} return this+"";
    };


    //不失精度计算 加、减、乘、除
    function accAdd(arg1,arg2){
        var r1,r2,m;
        try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
        try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
        m=Math.pow(10,Math.max(r1,r2));
        return (arg1*m+arg2*m)/m;
    }

    function Subtr(arg1,arg2){
        var r1,r2,m,n;
        try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
        try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
        m=Math.pow(10,Math.max(r1,r2));
        //last modify by deeka
        //动态控制精度长度
        n=(r1>=r2)?r1:r2;
        return ((arg1*m-arg2*m)/m).toFixed(n);
    }

    function accMul(arg1,arg2)
    {
        var m=0,s1=arg1.toString(),s2=arg2.toString();
        try{m+=s1.split(".")[1].length;}catch(e){}
        try{m+=s2.split(".")[1].length;}catch(e){}
        return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
    }

    function accDiv(arg1,arg2){
        var t1=0,t2=0,r1,r2;
        try{t1=arg1.toString().split(".")[1].length;}catch(e){}
        try{t2=arg2.toString().split(".")[1].length;}catch(e){}
        with(Math){
            r1=Number(arg1.toString().replace(".",""));
            r2=Number(arg2.toString().replace(".",""));
            return (r1/r2)*pow(10,t2-t1);
        }
    }

    Number.prototype.add = function (arg){
        return accAdd(arg,this);
    };

    Number.prototype.substr = function (arg){
        return Subtr(this, arg);
    };

    Number.prototype.mul = function (arg){
        return accMul(arg, this);
    };

    Number.prototype.div = function (arg){
        return accDiv(this, arg);
    };




    $("#total").on('keyup', function (event) {
        var $amountInput = $(this);
        //响应鼠标事件,允许左右方向键移动
        event = window.event || event;
        if (event.keyCode == 37 | event.keyCode == 39) {
            return;
        }
        //先把非数字的都替换掉,除了数字和.
        $amountInput.val($amountInput.val().replace(/[^\d.]/g, "").
            //只允许一个小数点
            replace(/^\./g, "").replace(/\.{2,}/g, ".").
            //只能输入小数点后两位
            replace(".", "$#$").replace(/\./g, "").replace("$#$", ".").replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'));
    });
    $("#total").on('blur', function () {
        var $amountInput = $(this);
        //最后一位是小数点的话,移除
        $amountInput.val(($amountInput.val().replace(/\.$/g, "")));
    });

    $(".jsqks").click( function() {
        //借款金额
        var toal = $("#total").val();
        //借款期限
        var month = $("#sumTerm").val();
        //借款年利率
        var year = $("#yearRate").val();
        //还款方式
        var type = $("#hkfs").val();
        //月利率
        var monthRate = parseFloat(year)/12;
        if(toal <= 0){
            alert("请输入投资金额");
            return false;
        }
        if(month <=0){
            alert("请输入投资期限");
            return false;
        }
        if(year <=0){
            alert("请输入年利率");
            return false;
        }

        var myreg1 = /^[0-9]([0-9])*$/;       //只能输入整数
        var myreg2 = /^(([1-9]+)|([0-9]+\.[0-9]{1}))$/;		//只能输入小数点后有一位的数字
        var myreg3 = /^(([1-9]+)|([0-9]+\.[0-9]{1,2}))$/;   //只能输入小数点后有两位的数字
        var yeareg=/^\d+(\d|(\.[1-9]{1}))$/;
        if(!myreg1.test(toal) && !myreg2.test(toal) && !myreg3.test(toal)){
            return;
        }
        if(!yeareg.test(year) && !myreg1.test(year)){
            return;
        }

        $("#showjs1").show();
        $("#showjs2").show();
        if(type == "DEBX"){
            monthRate = monthRate/100;
            //月还本息
            //每月还款额=[总本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^总期数-1]
            //power(1+x,n)*x*y/ (power(1+x,n)-1)
            var yhbx = ((Math.pow(1+monthRate, month)*monthRate*toal)/(Math.pow(1+monthRate, month)-1)).toFixed(2);
            $("#mthns").html(month+'月');
            $("#mtoal").html(toal+'元');

            //应收利息
            var yslxh = 0;
            $(".jstr").html("");
            var content='<tr>';
            content+='<th>期次</th>';
            content+='<th>偿还本息(元)</th>';
            content+='<th>偿还利息(元)</th>';
            content+='<th>偿还本金(元)</th>';
            content+='<th>剩余本金(元)</th>';
            content+='</tr>';

            //已还本金之和
            var totalYhbj = 0;
            var dsbj = 0;
            var yhbj = 0;
            var  interest_cur = 0;
            var zhdhbj = toal;
            for(var i=1;i<=month;i++){
                //应还利息
                interest_cur = parseFloat(Subtr(toal,totalYhbj)*monthRate).toFixed(2);
                //应还本金
                yhbj = parseFloat(Subtr(yhbx, interest_cur)).toFixed(2);

                totalYhbj =accAdd(totalYhbj, yhbj);
                //待收本金
                dsbj  = parseFloat(Subtr(toal, totalYhbj)).toFixed(2);

                if(i == (month-1)){
                    zhdhbj =  dsbj;
                }
                if(i == month){
                    yhbj = zhdhbj;
                    //应还利息
                    interest_cur = parseFloat(Subtr(yhbx, yhbj)).toFixed(2);
                    totalYhbj =accAdd(totalYhbj, yhbj);
                    dsbj  = 0;
                }

                content+='<tr>';
                content+='<td>'+i+'</td>';
                content+='<td id="ysbx'+i+'">'+yhbx+'</td>';
                content+='<td id="yslx'+i+'">'+interest_cur+'</td>';
                content+='<td id="ysbj'+i+'">'+yhbj+'</td>';
                content+='<td id="dsbj'+i+'">'+dsbj+'</td>';
                content+='</tr>';
                yslxh=accAdd(yslxh, interest_cur);
            }
            $("#ghbx").html(yslxh.toFixed(2)+'元');
            $(".jstr").append(content);
        }else if(type == "DEBJ"){
            //月利息
            $("#mthns").html(month+'月');
            $("#mtoal").html(toal+'元');


            $(".jstr").html("");
            var content='<tr>';
            content+='<th>期次</th>';
            content+='<th>偿还本息(元)</th>';
            content+='<th>偿还利息(元)</th>';
            content+='<th>偿还本金(元)</th>';
            content+='<th>剩余本金(元)</th>';
            content+='</tr>';

            var new_ysbx = 0;
            var new_ysbj = 0;
            var new_yslx = 0;
            var new_sybj = 0;
            var yslxTotle = 0;
            var ysbjTotle = 0;
//						 new_ysbj = parseInt(toal).div(month);
            new_ysbj = toal/month;
            for(var i=1;i<=month;i++){
                new_yslx = (toal - ysbjTotle)*(monthRate/100);
                ysbjTotle = ysbjTotle + new_ysbj;
                new_ysbx = new_yslx + new_ysbj;
                new_sybj = toal - new_ysbj*i;
                content+='<tr>';
                content+='<td>'+i+'</td>';
                content+='<td id="ysbx'+i+'">'+new_ysbx.toFixed(2)+'</td>';
                content+='<td id="yslx'+i+'">'+new_yslx.toFixed(2)+'</td>';
                content+='<td id="ysbj'+i+'">'+new_ysbj.toFixed(2)+'</td>';
                content+='<td id="dsbj'+i+'">'+new_sybj.toFixed(2)+'</td>';
                content+='</tr>';

                yslxTotle = accAdd(yslxTotle,new_yslx);

            }
            $("#ghbx").html(yslxTotle.toFixed(2)+'元');
            $(".jstr").append(content);

        }else if(type == "YCFQ"){
            //还利息
            var yslx = (monthRate * toal * month)/100;
            $("#mthns").html(month+'月');
            $("#mtoal").html(toal+'元');
            $("#ghbx").html(yslx.toFixed(2)+'元');

            $(".jstr").html("");
            var content='<tr>';
            content+='<th>期次</th>';
            content+='<th>偿还本息(元)</th>';
            content+='<th>偿还利息(元)</th>';
            content+='<th>偿还本金(元)</th>';
            content+='<th>剩余本金(元)</th>';
            content+='</tr>';

            for(var i=1;i<=month;i++){
                var new_ysbx = 0;
                var new_ysbj = 0;
                var new_yslx = 0;
                var new_sybj = parseFloat(toal);
                if(i == month){
                    new_yslx = yslx;
                    new_ysbj = parseFloat(toal);
                    new_ysbx = accAdd(new_yslx,new_ysbj);
                    new_sybj = 0;
                }


                content+='<tr>';
                content+='<td>'+i+'</td>';
                content+='<td id="ysbx'+i+'">'+new_ysbx.toFixed(2)+'</td>';
                content+='<td id="yslx'+i+'">'+new_yslx.toFixed(2)+'</td>';
                content+='<td id="ysbj'+i+'">'+new_ysbj.toFixed(2)+'</td>';
                content+='<td id="dsbj'+i+'">'+new_sybj.toFixed(2)+'</td>';
                content+='</tr>';

            }
            $(".jstr").append(content);
        }else if(type == "MYFX"){
            //月还本息
            var yslx = (monthRate * toal)/100;
            $("#mthns").html(month+'月');
            $("#mtoal").html(toal+'元');
            var yslxTotle = 0;

            $(".jstr").html("");
            var content='<tr>';
            content+='<th>期次</th>';
            content+='<th>偿还本息(元)</th>';
            content+='<th>偿还利息(元)</th>';
            content+='<th>偿还本金(元)</th>';
            content+='<th>剩余本金(元)</th>';
            content+='</tr>';

            for(var i=1;i<=month;i++){
                var new_ysbx = 0;
                var new_ysbj = 0;
                var new_yslx = 0;
                var new_sybj = parseFloat(toal);
                new_yslx = yslx;
                if(i == month){
                    new_ysbj = parseFloat(toal);
                    new_sybj = 0;
                }
                new_ysbx = new_yslx + new_ysbj;

                content+='<tr>';
                content+='<td>'+i+'</td>';
                content+='<td id="ysbx'+i+'">'+new_ysbx.toFixed(2)+'</td>';
                content+='<td id="yslx'+i+'">'+new_yslx.toFixed(2)+'</td>';
                content+='<td id="ysbj'+i+'">'+new_ysbj.toFixed(2)+'</td>';
                content+='<td id="dsbj'+i+'">'+new_sybj.toFixed(2)+'</td>';
                content+='</tr>';

                yslxTotle  = accAdd(yslxTotle,new_yslx.toFixed(2));

            }
            $("#ghbx").html(yslxTotle.toFixed(2)+'元');
            $(".jstr").append(content);

        }
    });

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

css样式:(美观代码,无实际意义)


                      table{
                          /*设置表格的宽度*/
                          width: 500px;
                          /*设置居中*/
                          margin: 0 auto;
                          /*设置边框*/
                          /*border: 1px solid black;*/
                          /**
                           *     table的td之间默认有一个距离,通过border-spacing属性可以设置这个像素
                           */
                          /*border-spacing: 0px;*/
                          /**
                           *     border-collapse可以用来设置表格的边框合并,如果设置了该属性,border-spacing会自动失效
                           */
                          border-collapse: collapse;
                      }

/**
 *     伪类nth-child的even参数可以选中偶数行,而odd则可以选中奇数行。
 *
 *     温馨提示:
 *         nth-child属性IE8及以下版本并不支持,若非要达到相同的效果则需要引入JS来搞事情。
 */
tr:nth-child(even){
    background-color: #b2dba1;
}

/**
 *     当鼠标移入到tr标签后,会改变颜色
 */
tr:hover{
    background-color: #c7ddef;
}

/*为td标签设置样式*/
td,th{
    /*设置边框*/
    border: 1px solid black;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值