js 数字加减乘除导致精度丢失的问题(修改后)

场景:
一个关于充值乘车的业务场景,用户的账户余额出现浮点数时,之前用整型的车次价格直接减去了账户余额,出现了精度缺失,不能做预结动作。实际案例:2-1.10,出现了0.8999999999的结果。
注:由于前后台交互的金额都是 以分为单位,并且为字符串类型,所以本篇的减法方法返回值是分,且字符串,谨记!!!

错误代码:

 	  var test1 = "110"
      test1 = Number(test1) 
      
      var test2 = Number(test1 / 100).toFixed(2)
      console.log(test2)  //结果 1.10
      console.log(Number(2 - test2)) //结果 0.8999999999999999
      
      var test3 = (Number(2).toFixed(2) - test2) * 100 + ''
      console.log(test3)  //结果 89.99999999999999

正确代码:

//减法,num1:被减数,num2:减数
function  numSub(num1, num2) {
    var baseNum, baseNum1, baseNum2;
    var 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;
    console.log("-----应该充值的结果---")
      console.log(parseInt(Number((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(2)*100)+'')
    return (parseInt( Number((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(2) )* 100 )+ '';
    下面两步乘100 造成了精度缺失
//    console.log(((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision) * 100+'')
 //   return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision) * 100+'';
  },

//以下可参考
function numAdd(num1, num2) {//加法
    var baseNum, baseNum1, baseNum2;
    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));
    return (num1 * baseNum + num2 * baseNum) / baseNum;
};
/**
 * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
 * 
 * @param num1被乘数 | num2乘数
 */
function numMulti(num1, num2) {
    var baseNum = 0;
    try {
        baseNum += num1.toString().split(".")[1].length;
    } catch (e) {
    }
    try {
        baseNum += num2.toString().split(".")[1].length;
    } catch (e) {
    }
    return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
};
/**
 * 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
 * 
 * @param num1被除数 | num2除数
 */
function numDiv(num1, num2) {
    var baseNum1 = 0, baseNum2 = 0;
    var baseNum3, baseNum4;
    try {
        baseNum1 = num1.toString().split(".")[1].length;
    } catch (e) {
        baseNum1 = 0;
    }
    try {
        baseNum2 = num2.toString().split(".")[1].length;
    } catch (e) {
        baseNum2 = 0;
    }
    with (Math) {
        baseNum3 = Number(num1.toString().replace(".", ""));
        baseNum4 = Number(num2.toString().replace(".", ""));
        return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
    }
};


你可能感兴趣的:(js)