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

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

作者: 爱吃胖子的瘦子 | 来源:发表于2017-07-03 10:33 被阅读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() 10^2==100;2^3==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/jbsacxtx.html