关于浮点类型计算精度问题

今天看到一个自己感觉有点意思的问题,这个问题之前在做商城项目的时候也有遇到过,在购物车中将勾选上的商品需要运用公式去前端计算返显出来,总合(商品单价×商品数量),这样咋一看好像没什么毛病,但是会出现 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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容