javascript高精度计算解决方案

1,简介             Javascript中高精度计算,主要解决Javascript不精确问题,此解决方案包括,浮点数数计算出现不精确问题;浮点数计算中指定精度的方法。计算不精确通过 Arithmetic(函数)处理;指定精度通过FormatByAccuracy(函数)处理,这两个函数也是本实例中最主要的两个方法。可用于JS开发和.NET的ajax开发项目中。

2,实例

 

<script language="javascript" type="text/javascript"> function AutoCalculate(rowid,flag){ /// 自动计算数量、单价、金额 /// 输入框控件 /// new rowid /// N数量P单价M金额 var objN = document.getElementById("txtN"+rowid); var objP = document.getElementById("txtP"+rowid); var objM = document.getElementById("txtM"+rowid); //取设置的精度 var np = document.getElementById("txtNP").value; var pp = document.getElementById("txtPP").value; var mp = document.getElementById("txtMP").value; //check if(np>21||pp>21||mp>21) { alert('精度最大21!'); return; } /* if((objN.value<1&&np==0)||(objP.value<1&&pp==0)||(objM.value<1&&mp==0)) { alert('数值小于1,精度不能为0!'); return; }*/ //数据精度处理 objN.value = FormatByAccuracy(objN.value,np); objP.value = FormatByAccuracy(objP.value,pp); //进行计算 if(flag=="N"){ //修改数量 if(objN.value!=""){ //如果数量栏位值不为空 if(objP.value != ""){ // 如果单价不为空,则重新计算金额 objM.value = Arithmetic(objN.value,'*',objP.value); }else{ if(objM.value!=""){ //如果单价为空,金额不为空,计算出单价 if(objN.value!=0){//如果数量不为0 objP.value = Arithmetic(objM.value,'/',objN.value); } } } }else{ //如果数量栏位值为空,则清空金额栏位。 objM.value = ""; } }else if(flag=="P"){//修改单价 if(objP.value!=""){ //如果单价栏位值不为空 if(objN.value!=""){ //如果数量栏位值不为空,重算金额栏位 objM.value = Arithmetic(objN.value,'*',objP.value); }else{//数量栏位值为空,清空金额栏位 objM.value = ""; } }else{//如果单价栏位值为空 if(objN.value!=""){ //如果数量栏位值不为空,清空金额栏位 objM.value = ""; }else{ } } }else if(flag=="M"){//修改金额 if(objM.value!=""){ //如果金额栏位值不为空 if(objN.value!=""){ //如果数量栏位值不为空,重算单价栏位 if(objN.value!="0"){//如果数量不为0 objP.value = Arithmetic(objM.value,'/',objN.value); } }else{//数量栏位值为空,清空单价栏位 objP.value = ""; } }else{//如果金额栏位值为空 if(objN.value!=""){ //如果数量栏位值不为空,清空单价栏位 objP.value = ""; }else{ } } } //处理计算结果精度,有可能是算金额,有可能是算单价 objP.value = FormatByAccuracy(objP.value,pp); objM.value = FormatByAccuracy(objM.value,mp); //计算合计金额 CalculateSumMoney(); } function CalculateSumMoney(){ /// 计算合计金额 var objM = document.getElementsByName("txtM"); var sumMoney =0; var m; for(var i=0;i 浮点数精度处理 /// 小数位精度 /// 由于toPrecision是从第一个不为0的值开始处理精度, ///所以暂不考虑0.00000X(<0.01)的情况 if(val){ if(accuracy==0&&parseFloat(val)<1){ return parseFloat(val).toPrecision(); }else{ val = Number(val).toString(); index = val.indexOf('.'); //len整数位精度 len = index==-1?val.length:(val.substr(0,index)=='0'?index-1:index); accuracy = parseInt(len,10)+parseInt(accuracy,10); //toPrecision最大支持21位处理 accuracy = accuracy>21?21:accuracy; return parseFloat(val).toPrecision(accuracy); } }else{ return val; } } function Arithmetic(arg1,operator,arg2){ /// 四则运算,基本思路:转整计算然后恢复小数位 /// operator运算符 /// 计算结果 var r1,r2,mul,size; try{ r1=arg1.toString().split(".")[1].length; }catch(e){ r1=0; } try{ r2=arg2.toString().split(".")[1].length; }catch(e){ r2=0; } size = Math.max(r1,r2); switch(operator){ case "+": case "-": mul = size; break; case "*": mul = 2 * size; break; case "/": mul = 0; break; } return eval((arg1*Math.pow(10, size)) + operator + (arg2*Math.pow(10, size))) / Math.pow(10, mul); } </script>
数量精度: 单价精度: 金额精度:
数量单价金额

3,code

 
<html>

<head> 

	<title>javascript高精度计算解决方案</title>

    <script language="javascript" type="text/javascript">

    	

        function AutoCalculate(rowid,flag){

            /// <summary>自动计算数量、单价、金额</summary>   

            /// <param name="obj">输入框控件</param> 	

            /// <param name="rowid">new rowid</param> 	

            /// <param name="flag">N数量P单价M金额</param> 	

		    var objN = document.getElementById("txtN"+rowid);

		    var objP = document.getElementById("txtP"+rowid);

		    var objM = document.getElementById("txtM"+rowid);

		    

		    //取设置的精度

		    var np = document.getElementById("txtNP").value;

		    var pp = document.getElementById("txtPP").value;

		    var mp = document.getElementById("txtMP").value;

		    

		    //check

		    if(np>21||pp>21||mp>21)

		    {

		      alert('精度最大21!'); 

		      return;

		    }

		    

            //数据精度处理

            objN.value = FormatByAccuracy(objN.value,np);

            objP.value = FormatByAccuracy(objP.value,pp);

                

            //进行计算

		    if(flag=="N"){ //修改数量

		        if(objN.value!=""){ //如果数量栏位值不为空

		            if(objP.value != ""){ // 如果单价不为空,则重新计算金额

		                objM.value = Arithmetic(objN.value,'*',objP.value);

		            }else{ 

		                if(objM.value!=""){ //如果单价为空,金额不为空,计算出单价

		                    if(objN.value!=0){//如果数量不为0

		                        objP.value = Arithmetic(objM.value,'/',objN.value);

		                    }

		                }

		            }

		        }else{  //如果数量栏位值为空,则清空金额栏位。

		            objM.value = "";

		        }

		    }else if(flag=="P"){//修改单价

		         if(objP.value!=""){ //如果单价栏位值不为空

		              if(objN.value!=""){ //如果数量栏位值不为空,重算金额栏位

		                  objM.value = Arithmetic(objN.value,'*',objP.value);

		              }else{//数量栏位值为空,清空金额栏位

		                  objM.value = "";

		              }

		         }else{//如果单价栏位值为空

		              if(objN.value!=""){ //如果数量栏位值不为空,清空金额栏位

		                  objM.value = "";

		              }else{

    		          

		              }

		         }

		    }else if(flag=="M"){//修改金额

		         if(objM.value!=""){ //如果金额栏位值不为空

		              if(objN.value!=""){ //如果数量栏位值不为空,重算单价栏位

		                  if(objN.value!="0"){//如果数量不为0

		                      objP.value = Arithmetic(objM.value,'/',objN.value);

		                  }

		              }else{//数量栏位值为空,清空单价栏位

		                  objP.value = "";

		              }

		         }else{//如果金额栏位值为空

		              if(objN.value!=""){ //如果数量栏位值不为空,清空单价栏位

		                  objP.value = "";

		              }else{

		              }

		         }

		    }	

		    //处理计算结果精度,有可能是算金额,有可能是算单价

		    objP.value = FormatByAccuracy(objP.value,pp);

		    objM.value = FormatByAccuracy(objM.value,mp);

		    

		    //计算合计金额

	        CalculateSumMoney();

        }

        

        function CalculateSumMoney(){

            /// <summary>计算合计金额</summary>

            var objM = document.getElementsByName("txtM");

            var sumMoney =0;

            var m;

            for(var i=0;i<objM.length;i++){

                m = objM.item(i).value;

                if(m != ""){

                    sumMoney = Arithmetic(sumMoney,'+',m);

                }

            }

            document.getElementById("txtSum").value = sumMoney;

        }

        function FormatByAccuracy(val,accuracy){

            /// <summary>浮点数精度处理</summary>

            /// <par accuracy>小数位精度</par>

            /// <bug>由于toPrecision是从第一个不为0的值开始处理精度,

            ///所以暂不考虑0.00000X(<0.01)的情况</bug>

            if(val){

                if(accuracy==0&&parseFloat(val)<1){

                    return parseFloat(val).toPrecision();

                }else{

                	val = Number(val).toString();

	                index = val.indexOf('.');

	                //len整数位精度

	                len = index==-1?val.length:(val.substr(0,index)=='0'?index-1:index);

	                accuracy = parseInt(len,10)+parseInt(accuracy,10);

	                //toPrecision最大支持21位处理

	                accuracy = accuracy>21?21:accuracy;                

                    return parseFloat(val).toPrecision(accuracy);

                }

            }else{

                return val;

            }

        }

        function Arithmetic(arg1,operator,arg2){

            ///<summary>四则运算,基本思路:转整计算然后恢复小数位</summary>

            ///<par>operator运算符</par>

            ///<result>计算结果</result>

            var r1,r2,mul,size;

            try{

                r1=arg1.toString().split(".")[1].length;

            }catch(e){

                r1=0;

            }

            try{

                r2=arg2.toString().split(".")[1].length;

            }catch(e){

                r2=0;

            }

            size = Math.max(r1,r2);

            switch(operator){

                    case "+":

                    case "-":

                            mul = size;

                            break;

                    case "*":

                            mul = 2 * size;

                            break;

                    case "/":

                            mul = 0;

                            break;

            }

            return eval((arg1*Math.pow(10, size)) + operator + (arg2*Math.pow(10, size))) / Math.pow(10, mul);

        }



    </script>

</head>

<body>

    <form id="form1" >

    	<h3>简介</h3>

    	Javascript中高精度计算,主要解决Javascript不精确问题,此解决方案包括,浮点数数计算出现不精确问题;浮点数计算中指定精度的方法。<br>计算不精确通过 Arithmetic(函数)处理;指定精度通过FormatByAccuracy(函数)处理,这两个函数也是本实例中最主要的两个方法。<br> 可用于JS开发和.NET的ajax开发项目中。</

    	<hr>

    	数量精度:<input type="text" id="txtNP" value="1" />

		单价精度:<input type="text" id="txtPP" value="1" />

		金额精度:<input type="text" id="txtMP" value="1" />

        <table width="600" border="1" cellpadding="0" id="tblMats" cellspacing="0" >

          <tr height="20" align="center"> 

            <th  width="60px">数量</th>  

            <th  width="60px">单价</th> 

            <th  width="70px">金额</th>

          </tr>

          <tr height="21"  align="center">    

            <td >

                <input width="40" type="text" id="txtN0" οnblur="AutoCalculate(0,'N')" style="width:100%; text-align:right"  />

            </td>                                

            <td >

                <input width="40" type="text" id="txtP0" οnblur="AutoCalculate(0,'P')" style="width:100%; text-align:right"  />

            </td>

            <td >

                <input width="40" type="text" name="txtM" id="txtM0" οnblur="AutoCalculate(0,'M')" style="width:100%; text-align:right"  />

            </td>

          </tr>

          <tr height="21"  align="center">     

            <td >

                <input width="40" type="text" id="txtN1" οnblur="AutoCalculate(1,'N')" style="width:100%; text-align:right"  />

            </td>                                

            <td >

                <input width="40" type="text" id="txtP1" οnblur="AutoCalculate(1,'P')" style="width:100%; text-align:right"  />

            </td>

            <td >

                <input width="40" type="text" name="txtM" id="txtM1" οnblur="AutoCalculate(1,'M')" style="width:100%; text-align:right"  />

            </td>

          </tr>

          <tr height="21"  align="center">

            <td  colspan="8">

                <input type="text" id="txtSum" value="0"  readonly="readonly" style="width:100%;text-align:right; "  /></td>



          </tr>

    </table>

    </form>

</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值