js关于小数点失精算法修正0.07*100竟然=7.000000000000001

 今天在做js测试的时候发现一个问题:0.07*100得出的结果不是7,而是7.000......1。如下:

// 关于js失精算法你都遇到哪些,让我们一起来细数一下吧  
console.log(0.07*100); // 7.000000000000001  
  
  
console.log(0.1+0.2); // 0.30000000000000004  
  
  
// ........

结果为什么是7.0000000000000001? 

查了下资料,其实JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义: http://en.wikipedia.org/wiki/IEEE_754-2008 decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。类似地,可以想像,1/3的结果应该是0.3333333333333333。        

 那么如何校正这个值呢?可以用以下方法:

 一、parseInt         var r4=parseInt(i*100);         

二、Math.round         var r2=Math.round((i*100)*1000)/1000;  

 以上两种方法都可以得到7,  附全部测试代码:

    <html>
    <head>
    <title>测试脚本</title>
    <script language="JAVASCRIPT">
    function init() 
    {
        var i = 0.07;
        var r = i*100;
        var r2=Math.round((i*100)*1000)/1000;
        var r3 = eval(i*100);
        var r4=parseInt(i*100);
        var r5=parseFloat(i*100*1.0000);
        var r6=(1/3);
        alert(r);
        alert("Math.round="+r2);
        alert("eval="+r3);
        alert("parseInt="+r4);
        alert("parseFloat="+r5);
        alert(""+r6);

        var n7 = 7;
        var rs = parseInt(n7.toFixed(2)* 100);
        alert(rs);
    }
    </script>
    </head>
        <body onload="init();">
        </body>
    </html>

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值