生活随笔
收集整理的這篇文章主要介紹了
javascript高精度计算解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先解決精度最便捷的方式:
x為要做精度處理的數值,先將x放大10000倍,再四舍五入,在除以10000倍。
Math.round(x*10000)/10000
(注意:這里乘的倍數和你要保留的小數位數相對應。比如要保留2位,則乘100倍;保留3位,則乘1000倍。)
該方法可以保證大部分情況下適用。
如果你要保證極其高的精度,則需要采用下面的方法處理。
--------------------------------------------------------------------------------------------------------------------------------------------
1,簡介 ??????????? Javascript中高精度計算,主要解決Javascript不精確問題,此解決方案包括,浮點數數計算出現不精確問題;浮點數計算中指定精度的方法。計算不精確通過 Arithmetic(函數)處理;指定精度通過FormatByAccuracy(函數)處理,這兩個函數也是本實例中最主要的兩個方法??捎糜贘S開發和.NET的ajax開發項目中。
2,實例
?
3,code
[html]?view plaincopy
?<pre?class="html"?name="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"?onblur="AutoCalculate(0,'N')"?style="width:100%;?text-align:right"??/>?? ?? ????????????</td>?????????????????????????????????? ?? ????????????<td?>?? ?? ????????????????<input?width="40"?type="text"?id="txtP0"?onblur="AutoCalculate(0,'P')"?style="width:100%;?text-align:right"??/>?? ?? ????????????</td>?? ?? ????????????<td?>?? ?? ????????????????<input?width="40"?type="text"?name="txtM"?id="txtM0"?onblur="AutoCalculate(0,'M')"?style="width:100%;?text-align:right"??/>?? ?? ????????????</td>?? ?? ??????????</tr>?? ?? ??????????<tr?height="21"??align="center">??????? ?? ????????????<td?>?? ?? ????????????????<input?width="40"?type="text"?id="txtN1"?onblur="AutoCalculate(1,'N')"?style="width:100%;?text-align:right"??/>?? ?? ????????????</td>?????????????????????????????????? ?? ????????????<td?>?? ?? ????????????????<input?width="40"?type="text"?id="txtP1"?onblur="AutoCalculate(1,'P')"?style="width:100%;?text-align:right"??/>?? ?? ????????????</td>?? ?? ????????????<td?>?? ?? ????????????????<input?width="40"?type="text"?name="txtM"?id="txtM1"?onblur="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>?? ?? </pre>??
總結
以上是生活随笔為你收集整理的javascript高精度计算解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。