美文网首页
js浮点数运算问题---莫名出现多位小数

js浮点数运算问题---莫名出现多位小数

作者: tobyDing | 来源:发表于2017-07-03 10:49 被阅读0次

    问题:js浮点数运算问题---莫名出现多位小数

    // 原因:这是由于在运算的时候先把浮点数转化成二进制后进行运算,
    // 但是有的小数在二进制编码后出现无限循环,
    // 因而导致计算出现了误差,在其它变成语言中也有类似的问题。
    console.log((0.1+0.2)==0.3)//false

    console.log(0.1+0.2)//0.30000000000000004
    console.log(0.22-0.12)//0.1 减法没有问题
    console.log(0.1*0.2)//0.020000000000000004
    console.log(0.1*3)//0.30000000000000004
    console.log(1.2/0.3)//4 这样的除法没问题
    console.log(1.2/3)//0.39999999999999997---能整除的除法
    

    // 解决办法:
    // 方法一:利用JavaScript 的toFixed(n) 方法,直接获取N 位小数
    // var a=0.888888.toFixed(2);
    // console.log(a);//0.89 toFixed方法是四舍五入的
    // 所以这种方法存在精确度问题,,,但基本上说是可以使用的

     console.log(0.1+0.2)//0.30000000000000004
     var n=(0.1+0.2).toFixed(1);
     console.log(n);//加法问题解决
    
     console.log(0.1*0.2)//0.020000000000000004
     var n=(0.1*0.2).toFixed(2);
     console.log(n);//乘法问题1解决
    
     console.log(0.1*3)//0.30000000000000004
     var n=(0.1*3).toFixed(1);
     console.log(n);//乘法问题2解决
    
     console.log(1.2/3)//0.39999999999999997
     var n=(1.2/3).toFixed(1);
     console.log(n);//能整除的除法问题解决
    
     console.log(0.1/3)
     var n=(0.1/3).toFixed(3);
     console.log(n);//不能整除的除法问题解决
    

    // 方法二:自己编写算法---核心思想是先把小数转换成整数,在进行运算,从而规避浮点数运算
    //自定义加法运算
    function addFloatNum (num1, num2) {//核心思想是先把小数转换成整数
    var sq1,sq2,m;
    try {
    sq1 = num1.toString().split(".")[1].length;//计算出小数点后有几位
    }
    catch (e) {
    sq1 = 0;//小数点后没有东西,就默认为零位
    }
    try {
    sq2 = num2.toString().split(".")[1].length;//计算出小数点后有几位
    }
    catch (e) {
    sq2 = 0;//小数点后没有东西,就默认为零位
    }
    m = Math.pow(10,Math.max(sq1, sq2));//Math.pow() 102==100;23==8;,,,10 100 1000...
    return (num1 * m + num2 * m) / m;
    }
    alert(addFloatNum(0.1, 0.2));//0.3
    alert(addFloatNum(1, 2));//0.1
    alert(addFloatNum(1, 0.2));//1.2

    相关文章

      网友评论

          本文标题:js浮点数运算问题---莫名出现多位小数

          本文链接:https://www.haomeiwen.com/subject/mgeacxtx.html