JDKHOME JDKHOME
  • Web

    • 权限框架Twiggy
    • 脚手架BLZO
  • 杂货
技术思考
  • Kubernetes
  • 文档
  • jdkhome
  • 友链
  • 版权声明
  • 分类
  • 标签
  • 归档
  • Web

    • 权限框架Twiggy
    • 脚手架BLZO
  • 杂货
技术思考
  • Kubernetes
  • 文档
  • jdkhome
  • 友链
  • 版权声明
  • 分类
  • 标签
  • 归档
  • JS浮点精确计算

    • 代码
      • 对比
      linkji
      2020-06-10
      随笔

      JS浮点精确计算

      # JS 浮点精确计算

      转载自: https://www.cnblogs.com/junjieok/p/3306155.html 目前已在自己的项目中使用,很稳很优雅

      # 代码

      (function () {
          var calc = {
              /*
              函数,加法函数,用来得到精确的加法结果  
              说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
              参数:arg1:第一个加数;arg2第二个加数;d要保留的小数位数(可以不传此参数,如果不传则不处理小数位数)
              调用:Calc.Add(arg1,arg2,d)  
              返回值:两数相加的结果
              */
              Add: function (arg1, arg2) {
                  arg1 = arg1.toString(), arg2 = arg2.toString();
                  var arg1Arr = arg1.split("."), arg2Arr = arg2.split("."), d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", d2 = arg2Arr.length == 2 ? arg2Arr[1] : "";
                  var maxLen = Math.max(d1.length, d2.length);
                  var m = Math.pow(10, maxLen);
                  var result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen));
                  var d = arguments[2];
                  return typeof d === "number" ? Number((result).toFixed(d)) : result;
              },
              /*
              函数:减法函数,用来得到精确的减法结果  
              说明:函数返回较为精确的减法结果。 
              参数:arg1:第一个加数;arg2第二个加数;d要保留的小数位数(可以不传此参数,如果不传则不处理小数位数
              调用:Calc.Sub(arg1,arg2)  
              返回值:两数相减的结果
              */
              Sub: function (arg1, arg2) {
                  return Calc.Add(arg1, -Number(arg2), arguments[2]);
              },
              /*
              函数:乘法函数,用来得到精确的乘法结果  
              说明:函数返回较为精确的乘法结果。 
              参数:arg1:第一个乘数;arg2第二个乘数;d要保留的小数位数(可以不传此参数,如果不传则不处理小数位数)
              调用:Calc.Mul(arg1,arg2)  
              返回值:两数相乘的结果
              */
              Mul: function (arg1, arg2) {
                  var r1 = arg1.toString(), r2 = arg2.toString(), m, resultVal, d = arguments[2];
                  m = (r1.split(".")[1] ? r1.split(".")[1].length : 0) + (r2.split(".")[1] ? r2.split(".")[1].length : 0);
                  resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m);
                  return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
              },
              /*
              函数:除法函数,用来得到精确的除法结果  
              说明:函数返回较为精确的除法结果。 
              参数:arg1:除数;arg2被除数;d要保留的小数位数(可以不传此参数,如果不传则不处理小数位数)
              调用:Calc.Div(arg1,arg2)  
              返回值:arg1除于arg2的结果
              */
              Div: function (arg1, arg2) {
                  var r1 = arg1.toString(), r2 = arg2.toString(), m, resultVal, d = arguments[2];
                  m = (r2.split(".")[1] ? r2.split(".")[1].length : 0) - (r1.split(".")[1] ? r1.split(".")[1].length : 0);
                  resultVal = Number(r1.replace(".", "")) / Number(r2.replace(".", "")) * Math.pow(10, m);
                  return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
              }
          };
          window.Calc = calc;
      }());
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57

      # 对比

      > 4.06 * 1000
      4059.9999999999995
      
      > Calc.Mul(4.06,1000)
      4060
      
      1
      2
      3
      4
      5
      上次更新: 2020/06/10, 18:06:00
      最近更新
      01
      搭建redis
      11-21
      02
      istio安装
      10-25
      03
      搭建K8S高可用集群
      09-13
      更多文章>
      鄂ICP备15015406号 | Copyright © 2015-2020 jdkhome
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式