浮点精度问题

学习内容:

一、浮点精度问题

    console.log(0.1+0.2)        //0.30000000000000004
    console.log(0.1+0.7)        //0.7999999999999999

1.产生原因
    js数值型包含整数、浮点数,-----Number   固定64位
        最高位------符号位
        第十一位----存储指数
        第五十二位--尾数位  超出部分自动舍弃

2.解决办法
    0.1+0.2=0.3
        (1)乘以10,再计算
            (0.1*10+0.2*10)/10=0.3

        (2)toFixed()  截取位数,四舍五入
            a=0.1+0.2
            a.toFixed(1)   //0.3

优化toFixed
        方法1:
        将获取的小数转换为字符串 根据小数点的下标判断截取小数位数的下标 判断截取小数的后一位 四舍还是五入 对截取小数位进行操作

            Number.prototype.mytoFixed=function(b){
            var a = this.toString() //11.334
            var c = (a.substring(0,a.indexOf(".")+1)).length //3
            var num =String(a).substring(0,c-1+b)//11.3
            if(String(a)[c+b] >= 5){
                num = num + (Number(String(a)[c-1+b])+1)

            }else{
                num = num + (String(a)[c-1+b])
            }
            return num
            }
            var a = 11.334
            console.log(a.mytoFixed(2))

        方法2:
        用toFixed获取需要截取位数的后面那一位,该位置上的数若等于5或者6,就让截取位上的数加1,否则返回正常的toFixed用法
            Number.prototype.mytoFixed=function(num,n){
            var a=num.toFixed(n+1)-num.toFixed(n)
            var b=a.toFixed(n+1)*Math.pow(10,n+1)
           if(b==5||b==6){
            return (Number(num.toFixed(3))+Number(Math.pow(0.1,n). toFixed(n))).toFixed(n)
           }else{
               return num.toFixed(n)
           }
        }
        var a=new Number().mytoFixed(1.335,2)
        console.log(a)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值