js数值计算的精度问题

//加法函数  
function accAdd(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;  
}   
//给Number类型增加一个add方法,,使用时直接用 .add 即可完成计算。   
Number.prototype.add = function (arg) {  
    return accAdd(arg, this);  
};  
  
//减法函数  
function Subtr(arg1, arg2) {  
    var r1, r2, m, n;  
    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));  
     //last modify by deeka  
     //动态控制精度长度  
    n = (r1 >= r2) ? r1 : r2;  
    return ((arg1 * m - arg2 * m) / m).toFixed(n);  
}  
  
//给Number类型增加一个add方法,,使用时直接用 .sub 即可完成计算。   
Number.prototype.sub = function (arg) {  
    return Subtr(this, arg);  
};  
  
//乘法函数  
function accMul(arg1, arg2) {  
    var m = 0, s1 = arg1.toString(), s2 = arg2.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);  
}   
//给Number类型增加一个mul方法,使用时直接用 .mul 即可完成计算。   
Number.prototype.mul = function (arg) {  
    return accMul(arg, this);  
};   
  
//除法函数  
function accDiv(arg1, arg2) {  
    var t1 = 0, t2 = 0, r1, r2;  
    try {  
        t1 = arg1.toString().split(".")[1].length;  
    }  
    catch (e) {  
    }  
    try {  
        t2 = arg2.toString().split(".")[1].length;  
    }  
    catch (e) {  
    }  
    with (Math) {  
        r1 = Number(arg1.toString().replace(".", ""));  
        r2 = Number(arg2.toString().replace(".", ""));  
        return (r1 / r2) * pow(10, t2 - t1);  
    }  
}   
//给Number类型增加一个div方法,,使用时直接用 .div 即可完成计算。   
Number.prototype.div = function (arg) {  
    return accDiv(this, arg);  
};   

 除法精度:

function exc(val, valTwo = 100) {
      const strVal = val.toString()
      const strValTwo = valTwo.toString()
      const index = strVal.indexOf('.')
      const indexTwo = strValTwo.indexOf('.')
      const num = [0, 0]
      if (index > -1) {
        num[0] = strVal.length - 1 - index
      }
      if (indexTwo > -1) {
        num[1] = strValTwo.length - 1 - index
      }
      return Math.round(val * Math.pow(10, num[0])) / (Math.round((valTwo * Math.pow(10, num[1]))) * Math.pow(10, num[0] - num[1]))
    }

 使用:exc(0.5, 0.2) => 2.5, 只允许传入两个参数。如果计算出现无穷数请后期根据需要修改最后代码进行取舍。

乘法精度:

function ride(...val) {
      const strVal = val[0].toString()
      const strValTwo = val[1].toString()
      const index = strVal.indexOf('.')
      const indexTwo = strValTwo.indexOf('.')
      const num = [0, 0]
      if (index > -1) {
        num[0] = strVal.length - 1 - index
      }
      if (indexTwo > -1) {
        num[1] = strValTwo.length - 1 - index
      }
      return Math.round((val[0] * Math.pow(10, num[0])) * (val[1] * Math.pow(10, num[1]))) / Math.pow(10, num[0] + num[1])
    }
 使用:ride(0.5, 0.6) => 3, 只允许传入两个参数。%计算可以这样ride(0.5, 100) => 50。

减法精度:

function sub(...val) {
      let max = 0
      let count = val[0] | 0
      for (let i = 0; i < val.length; i++) {
        const strVal = val[i].toString()
        const index = strVal.indexOf('.')
        let num = 0
        if (index > -1) {
          num = strVal.length - 1 - index
          max = num > max ? num : max
        }
      }
      for (let i = 0; i < val.length; i++) {
        count -= Math.round(val[i] * Math.pow(10, max))
      }
      return count / Math.pow(10, max)
    }
 使用:sub(1, 0.2, 0.3, 0.4) => 0.1。相当于1 - 0.2 -0.3 -0.4;可以传多个参数,使用首位减后面的所有参数。

加法精度:

function add(...val) {
      let max = 0
      let count = 0
      for (let i = 0; i < val.length; i++) {
        const strVal = val[i].toString()
        const index = strVal.indexOf('.')
        let num = 0
        if (index > -1) {
          num = strVal.length - 1 - index
          max = num > max ? num : max
        }
      }
      for (let i = 0; i < val.length; i++) {
        count += Math.round(val[i] * Math.pow(10, max))
      }
      return count / Math.pow(10, max)
    }
 使用:add(0.1, 0.2, 0.3, 0.4) => 1。可以传多个参数进行相加。

 

 

https://blog.csdn.net/github_38186390/article/details/84924741

posted @ 2020-09-07 17:46  wjs0509  阅读(805)  评论(0编辑  收藏  举报