zoukankan      html  css  js  c++  java
  • 解决js加减乘除的精度丢失

    export const InitNumberOperation = () => {
     
      function accDiv (arg1, arg2) {
        let t1 = 0
        let t2 = 0
        let r1 = ''
        let r2 = ''
        try {
          t1 = arg1.toString().split('.')[1].length
        } catch (e) {}
        try {
          t2 = arg2.toString().split('.')[1].length
        } catch (e) {}
        r1 = Number(arg1.toString().replace('.', ''))
        r2 = Number(arg2.toString().replace('.', ''))
        return accMul((r1 / r2), Math.pow(10, t2 - t1))
      }
      // 给Number类型增加一个div方法,调用起来更加方便。
      // eslint-disable-next-line
      Number.prototype.div = function (arg1, arg2) {
        return accDiv(arg1, arg2)
      }
      // 乘法函数,用来得到精确的乘法结果
      // 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
      // 调用:accMul(arg1,arg2)
      // 返回值:arg1乘以arg2的精确结果
      function accMul (arg1, arg2) {
        let m = 0
        const s1 = arg1.toString()
        const 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方法,调用起来更加方便。
      // eslint-disable-next-line
      Number.prototype.mul = function (arg1, arg2) {
        return accMul(arg1, arg2)
      }
      // 加法函数,用来得到精确的加法结果
      // 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
      // 调用:accAdd(arg1,arg2)
      // 返回值:arg1加上arg2的精确结果
      function accAdd (arg1, arg2) {
        console.log(arg1, arg2)
        let r1, r2
        let 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方法,调用起来更加方便。
      // eslint-disable-next-line
      Number.prototype.add = function (arg1, arg2) {
        return accAdd(arg1, arg2)
      }
      // 减法函数
      function accSub (arg2, arg1) {
        let r1, r2
        let m = ''
        let 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 ((arg2 * m - arg1 * m) / m).toFixed(n) - 0
      }
      /// 给number类增加一个sub方法,调用起来更加方便
      // eslint-disable-next-line
      Number.prototype.sub = function (arg1, arg2) {
        return accSub(arg1, arg2)
      }
    }
  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/binglove/p/15464913.html
Copyright © 2011-2022 走看看