今天看到一个自己感觉有点意思的问题,这个问题之前在做商城项目的时候也有遇到过,在购物车中将勾选上的商品需要运用公式去前端计算返显出来,总合(商品单价×商品数量),这样咋一看好像没什么毛病,但是会出现 0.1 + 0.2 != 0.3的问题,所以今天索性写了一个demo小解决一下这样的问题
/**
* 这里合并计算并添加到原型中去
* @param {Number} n1 加数
* @param {Number} n2 被加数
*/
Object.prototype.floatCount = function(n1,n2) {
let n1c = getCarryBit(n1),
n2c = getCarryBit(n2);
let carryBit = n1c > n2c ? n1c : n2c; //选择最大的进位
let n1Count = enAndRe(n1, carryBit, "en");
let n2Count = enAndRe(n2, carryBit, "en");
return enAndRe((n1Count + n2Count),carryBit, "re");
}
/**
* 用来获取数值是多少位小数点
* @param {Number} num 需要获取几位小数点的数值
*/
function getCarryBit(num) {
let splitArr = num.toString().split(".");
return splitArr.length == 2 ? splitArr[1].length : 0;
}
/**
* 用来进位退位用的
* @param {Number} num 需要进退位的数值
* @param {Number} cb 进位数
* @param {String} type en.进位 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))