陈建华的博客
专注web开发
javascript公式计算引擎-解决浮点数计算误差-网页计算器
2014-06-19 15:49:23   阅读8683次

我们大家都知道,javascript在计算公式的时候,会出现误差,导致我们本来就应该正确的代码,出现了我们意想不到的结果。

例如:

45.6*13=592.8000000000001(结果应该是592.8);
0.7+0.1=0.7999999999999999(应该是0.8);
//还有N多,在此不一一列举。

网上有一个比较认可的解决方法,就是自己去写加法,减法,乘法,除法。

例如:

// 两个浮点数求和
    function accAdd(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
       // return (num1*m+num2*m)/m;
       return Math.round(num1*m+num2*m)/m;
    }
    
    // 两个浮点数相减
    function accSub(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
       n=(r1>=r2)?r1:r2;
       return (Math.round(num1*m-num2*m)/m).toFixed(n);
    }
    // 两数相除
    function accDiv(num1,num2){
       var t1,t2,r1,r2;
       try{
           t1 = num1.toString().split('.')[1].length;
       }catch(e){
           t1 = 0;
       }
       try{
           t2=num2.toString().split(".")[1].length;
       }catch(e){
           t2=0;
       }
       r1=Number(num1.toString().replace(".",""));
       r2=Number(num2.toString().replace(".",""));
       return (r1/r2)*Math.pow(10,t2-t1);
    }
    
    function accMul(num1,num2){
       var m=0,s1=num1.toString(),s2=num2.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);
    }

但是有的时候,我们需要计算一连串的公式,并且里面包含了括号等等的复杂的符合运算,这个时候咱们应该怎么办呢?

例如:计算(0.7+0.1)÷(45.6*13)

这样的公式,我们是无法通过上面的自定义函数来解决的。因此今天给大家介绍一个比较好的计算引擎。

CalcEval.js

CalcEval引擎是一个专门解决javascript浮点数误差的的引擎,能够完美的解决各种复合的运算,最终输出正确的结果。

使用方法:

第一步:引入CalcEval.js

<script type="text/javascript" src="CalcEval.js"></script>

第二部:在页面上调用CalcEval的解析引擎入口

var ce = new CalcEval();//创建引擎对象
var result = ce.eval("(0.7+0.1)/(45.6*13)");//调用引擎接口来解析公式的字符串,这个地方,必须要将公式以字符串的形式传入。
alert(result);//查看返回结果。

就这么简单的过程,就可以解决了每个浏览器中的浮点数计算bug。同时也可以制作自己的网页计算器了。

CalcEval.js下载地址:

CalcEval.zip



-----------------------------------------------------
转载请注明来源此处
原地址:#

-----网友评论----
1楼:大虾哥 发表于 2017-01-12 18:10:52
解决了我大问题
2楼:chenjianhua 发表于 2017-01-16 18:48:55
哈哈。就是专门解决问题的。
3楼:。。。 发表于 2017-12-22 10:24:41
遗憾,貌似不支持带有变量的字符串
4楼:万里飘 发表于 2018-07-17 10:39:03
这个插件有非常严重的BUG,计算结果不准,它是按照除乘加减的顺序取的值。。 比如: var ce = new CalcEval();//创建引擎对象 var result1=ce.eval('3-1+2'); 正确的结果是4,他算出来的是0
-----发表评论----
微网聚博客乐园 ©2014 blog.mn886.net 鲁ICP备14012923号   网站导航