在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 購物車計算總價出現(xiàn)小數(shù)點怎么解決?

購物車計算總價出現(xiàn)小數(shù)點怎么解決?

如圖:
圖片描述

有個類似的問題,簡單的方法都試過了,如*100完了再/100,還有toFixed(2),都不管用..怎么解決..計算總和代碼如下:

//總計
this.totalPrice += this.car[i].num * this.car[i].price
回答
編輯回答
有你在
2018年8月27日 11:42
編輯回答
九年囚

這個是 js浮點計算導(dǎo)致的
toFixed和四舍五入相對來說 都是不精確的,
解決方案:

  1. 如果是實戰(zhàn)項目建議還是將值傳給后臺,讓后臺去計算。
  2. 或者引入js相關(guān)的插件進行計算。
  3. 最簡單的解決辦法就是 乘以10的n次冪,就是將數(shù)值轉(zhuǎn)化為 整數(shù)在進行計算
this.totalPrice += this.car[i].num * (this.car[i].price*10的n次方)
(16.56*10000*3)/10000 //這樣操作應(yīng)該是沒有問題

注意一定是盡可能大的 n次冪 ,100 肯定是不行的圖片描述

2017年6月2日 16:27
編輯回答
筱饞貓

js取float型小數(shù)點后兩位數(shù)的方法:http://www.jb51.net/article/4...,希望可以幫到你,實在不行就讓后端來計算吧。

2017年3月3日 15:03
編輯回答
乞許

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

這樣不行?

2017年9月5日 16:43
編輯回答
心癌

toFixed(2)應(yīng)該沒問題吧? 如果是精度問題最好不要直接操作

/**
 * 加法運算,避免數(shù)據(jù)相加小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
 * 
 * @param num1加數(shù)1 | num2加數(shù)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;
};

/**
 * 減法運算,避免數(shù)據(jù)相減小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
 * 
 * @param num1被減數(shù)  |  num2減數(shù)
 */
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);
};

/**
 * 乘法運算,避免數(shù)據(jù)相乘小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
 * 
 * @param num1被乘數(shù) | num2乘數(shù)
 */
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);
};

/**
 * 除法運算,避免數(shù)據(jù)相除小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
 * 
 * @param num1被除數(shù) | num2除數(shù)
 */
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);
    }
};
2017年10月29日 04:34
編輯回答
心悲涼

你是想四舍五入保留兩位小數(shù)么?toFixed(2)為什么不管用?

2017年4月11日 19:47
編輯回答
還吻

徹底解決的方案是用‘分’表示金額。

如果不想改,*100 轉(zhuǎn)換成int再進行計算。
最后的結(jié)果再除以100不會有問題。

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

clipboard.png

2017年6月8日 12:03
編輯回答
膽怯

結(jié)合了一些大家說的方法,最后是這樣解決的:

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

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


目前看來這算是最簡單的方法了,其他方法都或多或少的有些漏洞,還是會運算出小數(shù)點。
如果還有更簡單精確的辦法歡迎回答。

2017年4月3日 14:38
編輯回答
柒槿年
this.totalPrice = this.totalPrice.toPrecision(2)
2017年7月11日 11:30