zoukankan      html  css  js  c++  java
  • js float运算精度问题

    先放个前辈的文章:JavaScript数字精度丢失问题总结

    今天遇到了19.99*100的问题,答案不等于1999,因为在javascript中浮点数的计算是以2进制计算的。自己写了一波解决方法(不能单纯的乘Math.pow(10,N)变成整数运算完再除掉,因为乘也会有精度问题,就像题面19.99*100不等于1999。):

    function formatFloat(num1,num2){
        var str1 = num1.toString();
        var str2 = num2.toString();
        var c1 = str1.lastIndexOf(".")==-1?0:str1.lastIndexOf(".");
        var c2 = str2.lastIndexOf(".")==-1?0:str2.lastIndexOf(".");
        var n1 = str1.replace('.','');
        var n2 = str2.replace('.','');
        console.log(n1,n2);
        return parseInt(n1)*parseInt(n2)/Math.pow(10,c1+c2);
    }
    console.log(formatFloat(19.99,100));
    

    这里把小数变整数的方法是用字符串方法去掉小数点。

    然后上网一查,自己的方法其实早就有啦,而且网上的更全面,所以摘抄下来一个备用:

    /** 
    * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 
    * 
    * @param num1加数1 | num2加数2 
    */ 
    function numAdd(num1, num2) { 
    var baseNum, baseNum1, baseNum2; 
    try { 
    baseNum1 = num1.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum1 = 0; 
    } 
    try { 
    baseNum2 = num2.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum2 = 0; 
    } 
    baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
    return (num1 * baseNum + num2 * baseNum) / baseNum; 
    }; 
    /** 
    * 加法运算,避免数据相减小数点后产生多位数和计算精度损失。 
    * 
    * @param num1被减数 | num2减数 
    */ 
    function numSub(num1, num2) { 
    var baseNum, baseNum1, baseNum2; 
    var precision;// 精度 
    try { 
    baseNum1 = num1.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum1 = 0; 
    } 
    try { 
    baseNum2 = num2.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum2 = 0; 
    } 
    baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
    precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2; 
    return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision); 
    }; 
    /** 
    * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。 
    * 
    * @param num1被乘数 | num2乘数 
    */ 
    function numMulti(num1, num2) { 
    var baseNum = 0; 
    try { 
    baseNum += num1.toString().split(".")[1].length; 
    } catch (e) { 
    } 
    try { 
    baseNum += num2.toString().split(".")[1].length; 
    } catch (e) { 
    } 
    return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum); 
    }; 
    /** 
    * 除法运算,避免数据相除小数点后产生多位数和计算精度损失。 
    * 
    * @param num1被除数 | num2除数 
    */ 
    function numDiv(num1, num2) { 
    var baseNum1 = 0, baseNum2 = 0; 
    var baseNum3, baseNum4; 
    try { 
    baseNum1 = num1.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum1 = 0; 
    } 
    try { 
    baseNum2 = num2.toString().split(".")[1].length; 
    } catch (e) { 
    baseNum2 = 0; 
    } 
    with (Math) { 
    baseNum3 = Number(num1.toString().replace(".", "")); 
    baseNum4 = Number(num2.toString().replace(".", "")); 
    return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1); 
    } 
    }; 
    
    
  • 相关阅读:
    jquery插件之文字无缝向上滚动
    jquery插件之tab标签页或滑动门
    jquery插件之表格隔行变色并鼠标滑过高亮显示
    jquery过滤器之:contains()、.filter()
    css3动画在动作结束时保持该状态不变的解决办法
    CSS3两个动画顺序衔接播放
    css去掉使用bootstrap框架后打印网页时预览效果下的超链接
    R in action读书笔记(13)第十章 功效分析
    Python学习 Day 7 面向对象 类和实例 访问限制
    R in action读书笔记(12)第九章 方差分析
  • 原文地址:https://www.cnblogs.com/macq/p/6545158.html
Copyright © 2011-2022 走看看