今天看到一個(gè)自己感覺有點(diǎn)意思的問題九火,這個(gè)問題之前在做商城項(xiàng)目的時(shí)候也有遇到過,在購物車中將勾選上的商品需要運(yùn)用公式去前端計(jì)算返顯出來,總合(商品單價(jià)×商品數(shù)量),這樣咋一看好像沒什么毛病唁情,但是會(huì)出現(xiàn) 0.1 + 0.2 != 0.3的問題,所以今天索性寫了一個(gè)demo小解決一下這樣的問題
/**
* 這里合并計(jì)算并添加到原型中去
* @param {Number} n1 加數(shù)
* @param {Number} n2 被加數(shù)
*/
Object.prototype.floatCount = function(n1,n2) {
let n1c = getCarryBit(n1),
n2c = getCarryBit(n2);
let carryBit = n1c > n2c ? n1c : n2c; //選擇最大的進(jìn)位
let n1Count = enAndRe(n1, carryBit, "en");
let n2Count = enAndRe(n2, carryBit, "en");
return enAndRe((n1Count + n2Count),carryBit, "re");
}
/**
* 用來獲取數(shù)值是多少位小數(shù)點(diǎn)
* @param {Number} num 需要獲取幾位小數(shù)點(diǎn)的數(shù)值
*/
function getCarryBit(num) {
let splitArr = num.toString().split(".");
return splitArr.length == 2 ? splitArr[1].length : 0;
}
/**
* 用來進(jìn)位退位用的
* @param {Number} num 需要進(jìn)退位的數(shù)值
* @param {Number} cb 進(jìn)位數(shù)
* @param {String} type en.進(jìn)位 re.退位
*/
function enAndRe(num, cb, type) {
for (let i = 0; i < cb; i++) {
if (type == "en") {
num = num * 10;
else {
num = num / 10;
}
}
return num;
}
console.log(Number.floatCount(0.11, 0.2))