前端:JS精确得到(加减乘除)的结果

本文提供了一组JavaScript函数,用于实现加法、减法、乘法和除法等基本数学运算的精确计算,解决了浮点数运算中常见的精度丢失问题。
  //加法函数,用来得到精确的加法结果
  //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  //调用:Add(arg1,arg2)
  //返回值:arg1加上arg2的精确结果
  function Add(arg1, arg2) {
    arg1 = parseFloat(arg1);
    arg2 = parseFloat(arg2);
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(100, Math.max(r1, r2));
    return (this.Mul(arg1, m) + this.Mul(arg2, m)) / m;
  }

  //减法函数,用来得到精确的减法结果
  //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
  //调用:Sub(arg1,arg2)
  //返回值:arg1减去arg2的精确结果
  function Sub(arg1, arg2) {
    arg1 = parseFloat(arg1);
    arg2 = parseFloat(arg2);
    var r1, r2, m, n;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((this.Mul(arg1, m) - this.Mul(arg2, m)) / m).toFixed(n);
  }

  //乘法函数,用来得到精确的乘法结果
  //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  //调用:Mul(arg1,arg2)
  //返回值:arg1乘以arg2的精确结果
  function Mul(arg1, arg2) {
    arg1 = parseFloat(arg1);
    arg2 = parseFloat(arg2);
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  }

  //除法函数,用来得到精确的除法结果
  //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  //调用:Div(arg1,arg2)
  //返回值:arg1除以arg2的精确结果
  function Div(arg1, arg2) {
    arg1 = parseFloat(arg1);
    arg2 = parseFloat(arg2);
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length; } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length; } catch (e) { }
    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));
    return this.Mul(r1 / r2 , Math.pow(10, t2 - t1));
  }

 

在 JavaScript 前端开发中,进行基本的数学运算(加法、减法、乘法和除法)是常见的需求,但由于 JavaScript 的浮点数精度问题,直接进行小数运算时可能会导致精度丢失。为了解决这个问题,可以采用以下方法确保运算的准确性。 ### 加法运算 在进行加法运算时,可以通过将小数转换为整数后再进行运算,以避免浮点数精度问题。具体实现如下: ```javascript function add(a, b) { const factor = Math.pow(10, Math.max(getDecimalPlaces(a), getDecimalPlaces(b))); return (a * factor + b * factor) / factor; } function getDecimalPlaces(num) { const match = ('' + num).match(/(?:\.(\d+))?$/); return match && match[1] ? match[1].length : 0; } ``` ### 减法运算 减法运算可以采用与加法类似的方法,将小数转换为整数后再进行运算: ```javascript function subtract(a, b) { const factor = Math.pow(10, Math.max(getDecimalPlaces(a), getDecimalPlaces(b))); return (a * factor - b * factor) / factor; } ``` ### 乘法运算 乘法运算的处理方式是将两个数的小数位数相加,然后将结果转换回正确的小数形式: ```javascript function multiply(a, b) { const factor = Math.pow(10, getDecimalPlaces(a) + getDecimalPlaces(b)); return Math.round(a * Math.pow(10, getDecimalPlaces(a)) * b * Math.pow(10, getDecimalPlaces(b))) / factor; } ``` ### 除法运算 除法运算可以通过将除数和被除数都转换为整数,然后进行整数除法来实现: ```javascript function divide(a, b) { const factor = Math.pow(10, getDecimalPlaces(b) - getDecimalPlaces(a)); return Math.round((a * Math.pow(10, getDecimalPlaces(a))) / (b * Math.pow(10, getDecimalPlaces(b))) * factor) / factor; } ``` ### 使用第三方库 为了简化开发流程并提高精度,可以使用专门处理高精度数学运算的库,例如 `BigDecimal.js` 或 `decimal.js`。这些库提供了更复杂和精确的数学运算功能。 ```javascript // 使用 decimal.js 示例 import Decimal from 'decimal.js'; const result = new Decimal(0.1).plus(new Decimal(0.2)); console.log(result.toString()); // 输出 0.3 ``` 通过上述方法,可以在 JavaScript 前端开发中正确执行加法、减法、乘法和除法运算,从而避免由于浮点数精度问题导致的计算错误[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值