js实现加减乘除 计算js丢失精度

/**

  • 公用方法
    /
    /
    *******应用于几乎所有页面************** */
    /**
  • 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
    返回值:arg1加上arg2的精确结果
  • @param {*加数} arg1
  • @param {*加数} arg2
  • @param {是否需要格式化} needFormat
    /
    function accAdd(arg1, arg2, needFormat) {
    arg1 = parseFloat(arg1 + "");
    arg2 = parseFloat(arg2 + "");
    if (isNaN(arg1)) {
    arg1 = 0;
    }
    if (isNaN(arg2)) {
    arg2 = 0;
    }
    var result = (arg1 * 100 + arg2 * 100) / 100;
    needFormat && (result = keepDecimalFull(result, $ANumPosition));
    return parseFloat(result) === 0 ? '' : result;
    }

function accSub(arg1, arg2, needFormat) {
arg1 = parseFloat(arg1 + "");
arg2 = parseFloat(arg2 + "");
if (isNaN(arg1)) {
arg1 = 0;
}
if (isNaN(arg2)) {
arg2 = 0;
}
var result = (arg1 * 100 - arg2 * 100) / 100;
needFormat && (result = keepDecimalFull(result, $ANumPosition));
return parseFloat(result) === 0 ? '' : result;
}
/**

  • 乘法
  • @param {*} arg1
  • @param {*} arg2
  • @param {是否需要格式化} needFormat
    /
    function accMulti(arg1, arg2, needFormat) {
    arg1 = parseFloat(arg1 + "");
    arg2 = parseFloat(arg2 + "");
    if (isNaN(arg1)) {
    arg1 = 0;
    }
    if (isNaN(arg2)) {
    arg2 = 0;
    }
    var result = arg1 * arg2;
    needFormat && (result = keepDecimalFull(result, $ANumPosition));
    return parseFloat(result) === 0 ? '' : result;
    }
    /**
  • 除法
  • @param {*被除数} Dividend
  • @param {*除数} Divisor
  • @param {*是否需要格式化} needFormat
  • @param {*是否生成百分比} isPercent
  • @param {额外的小数位数保留} extraFormat
    /
    function accDiv(Dividend, Divisor, needFormat, isPercent, extraFormat) {
    Dividend = parseFloat(Dividend + "");
    Divisor = parseFloat(Divisor + "");
    var result;

    if (isNaN(Dividend)) {
    Dividend = 0;
    }
    if (isNaN(Divisor)) {
    Divisor = 0;
    }

    if (Divisor === 0) {
    result = 0;
    } else {
    if (isPercent) {
    result = Dividend * 100 / Divisor;
    } else {
    result = Dividend / Divisor;
    }
    }
    needFormat && (result = keepDecimalFull(result, extraFormat ? extraFormat : $ANumPosition));
    return parseFloat(result) === 0 ? '' : result;
    }
    /**
  • toFixed 四舍五入不精确 比如127.425
  • @param {*数字} num
  • @param {保留位数} pos
    /
    function keepDecimalFull(num, pos) {
    var result = parseFloat(num);
    var decimal;
    var pos = pos || 2;
    var pos_multiple = 100;

    // 放大倍数
    if(pos){
    pos_multiple = 10;

     for(var i = 1;i < pos;i++){
         pos_multiple *= 10;
     }

    }

    if (isNaN(result)) {
    result = 0;
    }
    result = Math.round(num * pos_multiple) / pos_multiple;

    decimal = result.toString();

    // 补充小数点
    var pos_decimal = decimal.indexOf('.');
    if (pos_decimal < 0) {
    pos_decimal = decimal.length;
    decimal += '.';
    }

    while (decimal.length <= pos_decimal + pos) {
    decimal += '0';
    }
    return decimal;
    }

转载于:https://www.cnblogs.com/zhtian/p/10537781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值