• JS数字计算精度问题解决


     1       add(a, b) {//相加
     2           var c, d, e;
     3           try {
     4             c = a.toString().split(".")[1].length;
     5           } catch (f) {
     6             c = 0;
     7           }
     8           try {
     9             d = b.toString().split(".")[1].length;
    10           } catch (f) {
    11             d = 0;
    12           }
    13           return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
    14       },
    15       sub(a, b) {//相减
    16         var c, d, e;
    17         try {
    18           c = a.toString().split(".")[1].length;
    19         } catch (f) {
    20           c = 0;
    21         }
    22         try {
    23           d = b.toString().split(".")[1].length;
    24         } catch (f) {
    25           d = 0;
    26         }
    27         return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
    28       },
    29       mul(a, b) {//主体
    30         var c = 0,
    31           d = a.toString(),
    32           e = b.toString();
    33         try {
    34           c += d.split(".")[1].length;
    35         } catch (f) { }
    36         try {
    37           c += e.split(".")[1].length;
    38         } catch (f) { }
    39         return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    40       },
    41       div(a, b) {//
    42         var c, d, e = 0,
    43           f = 0;
    44         try {
    45           e = a.toString().split(".")[1].length;
    46         } catch (g) { }
    47         try {
    48           f = b.toString().split(".")[1].length;
    49         } catch (g) { }
    50         return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
    51       }

    js在数字计算时,因为IEEE 754会有精度丢失,完善一下,需要用到哪个,只要mul和你用到的函数就OK

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    20210104加更

      function adder(me) {
        var slice = Array.prototype.slice,
          __args = slice.call(arguments);
        return function () {
          var __inargs = slice.call(arguments);
          if( arguments.length == 0 ){
            var me = 0 ;
            for(var i in __args){
              me = Add(me, __args[i]);//这里为了处理精度问题
            }
            return me ;
          }
          else
            return adder.apply(this, __args.concat(__inargs));
        };
      };
      function Add(arg1,arg2){
        var r1,r2,m;
        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
        m=Math.pow(10,Math.max(r1,r2))
        return (arg1*m+arg2*m)/m
      }

    多个数字相加,柯里化实现adder(x)(c)(a)....()

  • 相关阅读:
    linux命令行下命令参数前的一横(-)和两横(--)的区别
    sql的集合操作
    二叉树的遍历
    linux网络编程中阻塞和非阻塞socket的区别
    Python 信号量
    python中文件的复制
    Linux网络服务器epoll模型的socket通讯的实现(一)
    Linux启动提示“unexpected inconsistency;RUN fsck MANUALLY”
    Linux用户级线程和内核级线程区别
    nodejs的cs模式聊天客户端和服务器实现
  • 原文地址:https://www.cnblogs.com/maomao93/p/9172625.html
Copyright © 2020-2023  润新知