大学专业是计算机童鞋或多或小的知道 计算机是由二进制存储和处理数字的,不能精确到处理浮点数,且javascript也没有这样的方法 所以在浏览器计算的时候也会有误差,比如说 我想用 3.3 / 1.1  那么按道理来说 答案是 3 ,对不对 但是我们可以打印出来看下 结果令我们很惊讶 是 2.9999999999999996 .现在我们想 为了避免产生精度差异,需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂). 这样处理下 就可以实现正常的结果。

基本原理:

   需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂). 这样处理下 就可以实现正常的结果。

 Javascript 如何解决对 "加法" 精度问题

       其实不管对于 加法,减法 乘法及除法也好 其基本原理都是一样 先乘以10的n次幂 成计算机能够识别的整数 然后计算 计算完成后 再除以10的n次幂 这样就可以得到想要的结果。

   现在我们先列举个列子 比如:var a = 1.3, b = 2.3;那么 我通过在火狐浏览器打印一下console.log(a+b)=? 结果在火狐浏览器下看到等于:3.5999999999999996 .这也就是说计算机对浮点计算存在精度问题。而现在我们想写个js函数方法,来避免这种情况的产生。

   函数的基本原理:先传入2个参数 分别为arg1,arg2;先判断下 如果2个参数都是浮点数的话 那么取得该2个参数的小数点后面的长度,分别保存到变量为firstArg,lastArg; 否则的话 如果那个参数不是浮点的话 那么让此fisrtArg或者lastArg赋值为0. 然后取得差值 differ = Math.abs(firstArg - lastArg).(目的是为了下面判断他们的小数点位数是否相同。) 接着获取最大的n次幂 如: m = Math.pow(10,Math.max(firstArg,lastArg));

   1. 接着上面的话说,如果小数点后面的位数长度相同的话 比如说 1.3 和 2.3 小数点后的数字都是3,那么他们的长度都是相同的的(为1).那么先变为整数 去掉小数点后计算 如:arg1 = Number(arg1.toString().replace(".", ""));arg2 = Number(arg2.toString().replace(".", "")); 然后接着再除以他们的n次幂 如:return (arg1 + arg2) / m; 这样可以返回结果。

   2. 如果小数点后面的位数长度不一致的话 先通过他们的差值 differ获取n次幂 如:var dm = Math.pow(10,differ); 再判断 如果 firstArg > lastArg 那么 arg1 = Number(arg1.toString().replace(".", "")); arg2 = Number(arg2.toString().replace(".", "")) * dm;否则的话 arg1 = Number(arg1.toString().replace(".", "")) * dm; arg2 = Number(arg2.toString().replace(".", "")); 再比如:var a = 1.31,b = 2.3; 那么 firstArg的长度为2 lastArg长度为1;因为 2 > 1 那么 arg1 = 131; arg2 = 23 * dm(如上:dm = Math.pow(10,differ));最后计算如:return (arg1 + arg2) / m --> (arg1 + arg2) / m  ---> (131 + 23*10) / Math.pow(10,Math.max(firstArg,lastArg)); --> 

 (131 + 230) / Math.pow(10,2) --> 361 / 100 = 3.61; 和1.31 + 2.3 结果一致。同理firstArg < lastArg也是一样的原理。这里不多说了。

 为了更详细的说明问题 我们可以先来看看流程图:如下:

  关于javascript中对浮点加,减,乘,除的精度分析

下面是JS函数代码如下:

/**
 * js加法 解决精度问题
 */

 function addFun(arg1,arg2) {
    var firstArg,
        lastArg,
        differ,
        m;
    try{
        firstArg = arg1.toString().split('.')[1].length;
    }
    catch (e){
        firstArg = 0;
    }

    try{
        lastArg = arg2.toString().split('.')[1].length;
    }
    catch (e){
        lastArg = 0;
    }
    differ = Math.abs(firstArg - lastArg);
    m = Math.pow(10,Math.max(firstArg,lastArg));
    
    if(differ > 0) {
        var dm = Math.pow(10,differ);
        if(firstArg > lastArg) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * dm;

        }else {
            arg1 = Number(arg1.toString().replace(".", "")) * dm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
     }else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
  • 2022-12-23
  • 2021-09-13
  • 2021-12-27
  • 2021-10-26
猜你喜欢
  • 2022-12-23
  • 2021-08-29
  • 2022-12-23
  • 2022-12-23
  • 2021-08-21
  • 2022-03-06
  • 2022-12-23
相关资源
相似解决方案