js中涉及到带小数点的计算时,出现的精确度损失情况的解决方法

 描述:在做一个小程序,一个功能是点击“+” 或者“-”数字会进行相应的变化。但是一开始碰到的问题是,初始数据为6,点击加号后,出现的不是6.1,而是6.099999999.查了一下发现这是进行浮点数运算时出现的缺失精准度的问题。现把在网上查找到的真实有用的解决方法记录下来。

 1.下面的图是小程序里面的截图,目前问题已经解决了,已经可以正常的进行加减了。方法是分别对增加和减少写了个处理函数,并封装在小程序的utils文件里面。代码如后面所示:

2.代码部分:

处理增加

/**
 * 该函数是处理以0.1的精度自增时,会出现小数相加损失精度的问题
 */
//定义一个加法函数
function add() {
    let args = arguments //获取所有的参数
   // var lens = args.length //获取参数的长度
    let l = 0 //定义小数位的初始长度length,默认为整数,即小数位为0
    let sum = 0 
    //循环所有的参数
    for (let key in args) { 
        //把数字转为字符串
        let str = "" + args[key];
        if (str.indexOf(".") != -1) { //判断数字是否为小数
            //获取小数位的长度
            let temp = str.split(".")[1].length;
            //比较此数的小数位与原小数位的长度,取小数位较长的存储到d中
            l = l < temp ? temp : l;
        }
    }
    //计算需要乘的数值
    let m = Math.pow(10, l);
    //遍历所有参数并相加
    for (let key in args) {
        sum += args[key] * m;
    }
    //返回结果
    return sum / m;
}

 处理减少:


/**
 * 处理js中相减时的小数问题
 * @param {num1} num1 
 * @param {num2} num2 
 */
function decrease(num1, num2) {
    let baseNum, baseNum1, baseNum2;
    //let precision; // 精度
    try {
        baseNum1 = num1.toString().split(".")[1].length;
    } catch (e) {
        baseNum1 = 0;
    }
    try {
        baseNum2 = num2.toString().split(".")[1].length;
    } catch (e) {
        baseNum2 = 0;
    }
    baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
    precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
    return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(1);//1是保留一位小数的意思
}

小程序的js代码:

 addSugar: function () {
    let sugardata = dateTimePicker.add(this.data.sugardata, 0.1)
    // console.log(sugardata)
    let that = this
    that.setData({
      sugardata: sugardata
    })
  },

  delSugar: function(){
    let sugardata = dateTimePicker.decrease(this.data.sugardata, 0.1)
    let that = this
    that.setData({
      sugardata: sugardata
    })
    },

 

先小小的记录一下。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值