购物车计算总价出现小数点怎么解决?

如图:
图片描述

有个类似的问题,简单的方法都试过了,如*100完了再/100,还有toFixed(2),都不管用..怎么解决..计算总和代码如下:

//总计
this.totalPrice += this.car[i].num * this.car[i].price
阅读 8.5k
9 个回答

结合了一些大家说的方法,最后是这样解决的:

this.totalPrice += this.car[i].num * this.car[i].price
var total = this.totalPrice
this.totalPrice = parseFloat(total.toFixed(2))

感谢大家的回答,谢谢各位。


目前看来这算是最简单的方法了,其他方法都或多或少的有些漏洞,还是会运算出小数点。
如果还有更简单精确的办法欢迎回答。

this.totalPrice = this.totalPrice.toPrecision(2)

你是想四舍五入保留两位小数么?toFixed(2)为什么不管用?

this.totalPrice += this.car[i].num * this.car[i].price
this.totalPrice = this.totalPrice.toFixed(2)

这样不行?

toFixed(2)应该没问题吧? 如果是精度问题最好不要直接操作

/**
 * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
 * 
 * @param num1加数1 | num2加数2
 */
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 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;
    return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
};

/**
 * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
 * 
 * @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浮点计算导致的
toFixed和四舍五入相对来说 都是不精确的,
解决方案:

  1. 如果是实战项目建议还是将值传给后台,让后台去计算。
  2. 或者引入js相关的插件进行计算。
  3. 最简单的解决办法就是 乘以10的n次幂,就是将数值转化为 整数在进行计算
this.totalPrice += this.car[i].num * (this.car[i].price*10的n次方)
(16.56*10000*3)/10000 //这样操作应该是没有问题

注意一定是尽可能大的 n次幂 ,100 肯定是不行的图片描述

彻底解决的方案是用‘分’表示金额。

如果不想改,*100 转换成int再进行计算。
最后的结果再除以100不会有问题。

    price = 16.56
    console.log(parseInt(price * 100) * 3  / 100)

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题