描述:在做一个小程序,一个功能是点击“+” 或者“-”数字会进行相应的变化。但是一开始碰到的问题是,初始数据为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
})
},
先小小的记录一下。