• wordpress CMS主题:ssmay主题wordpress CMS主题:ssmay主题
  • 首页 > JS应用 > JS公式计算引擎——解决javascript的浮点数计算误差

    JS公式计算引擎——解决javascript的浮点数计算误差

    作者: 分类:JS应用 点击: 167 次
    wordpress CMS主题:ssmay主题

      大家都知道,JS在计算公式时,会出现一些误差,导致本以为正确的代码,出现意想不到的结果。

      例如:

      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

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

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

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

      CalcEval.js下载地址:

      https://www.51dev.com/download/103

      以上就是javascript公式计算引擎-解决浮点数计算误差的全部内容,(转自:https://www.51dev.com/javascript/82020)



      QQ二维码

    文章作者:hero2018
    本文地址:http://wanlimm.com/77201808246682.html
    版权所有 © 转载时必须以链接形式注明作者和原始出处!

    上一篇:
    下一篇:
    wordpress CMS主题:ssmay主题

    或许你会感兴趣的文章:

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    This site uses Akismet to reduce spam. Learn how your comment data is processed.